2013-07-23 3 views
1

사용자를 SFTP 서버 응용 프로그램에 추가하기 위해 명령 줄 응용 프로그램을 만들 때 사용하는 구성 파일 (.cfg)이 있습니다.C에서 바이트 배열에서 바이트를 제거하고 추가하는 방법

cfg 파일은 cfg 파일의 각 항목에 대해 일정 수의 예약 된 바이트를 가져야합니다. 현재 바이트 배열을 만들고이를 문자열로 변환 한 다음 파일로 복사하여 새 사용자를 파일 끝 부분에 추가하고 있지만 걸림돌을 맞았습니다. 설정 파일은 파일의 끝에 4 바이트를 필요로합니다.

내가 수행해야하는 프로세스는 파일에서 이러한 후행 바이트를 제거하고 새 사용자를 추가 한 다음 끝에 바이트를 추가하는 것입니다.

이제 내 문제의 배경이 보입니다. 바이트 배열에서

어떻게 제거하고 추가 할 바이트 : 여기

질문입니까?

여기까지 코드가 있습니다. 한 파일에서 사용자를 읽고 다른 파일에 추가합니다.

static void Main(string[] args) 
     { 
      System.Text.ASCIIEncoding code = new System.Text.ASCIIEncoding();  //Encoding in ascii to pick up mad characters 
      StreamReader reader = new StreamReader("one_user.cfg", code, false, 1072); 

      string input = ""; 
      input = reader.ReadToEnd(); 

      //convert input string to bytes 
      byte[] byteArray = Encoding.ASCII.GetBytes(input); 
      MemoryStream stream = new MemoryStream(byteArray); 

      //Convert Stream to string 
      StreamReader byteReader = new StreamReader(stream); 
      String output = byteReader.ReadToEnd(); 
      int len = System.Text.Encoding.ASCII.GetByteCount(output); 

      using (StreamWriter writer = new StreamWriter("freeFTPdservice.cfg", true, Encoding.ASCII, 5504)) 
      { 
       writer.Write(output, true); 
       writer.Close(); 
      } 

      Console.WriteLine("Appended: " + len); 
      Console.ReadLine(); 
      reader.Close(); 
      byteReader.Close(); 
     } 

여기에 "다이어그램"이 나와 있습니다.

1) 우선, 사용자

파일 (첨부 된 텍스트) 단부에있는 바이트

(제로)

2 추가)

파일은 (첨부 된 텍스트) (첨부 된 텍스트)에서 바이트 번째 사용자 추가 끝 (제로)

등등.

+1

원하는 크기로 새 배열로 복사합니다. –

답변

1

그렇지 않습니다. 원하는 크기의 새 배열로 복사 할 수 있습니다. 또는 List<byte>으로 작업 한 다음 해당 배열을 만들 수 있습니다.

그러나, 귀하의 경우에, 나는 파일에보고 제안하는 것은 스스로를 스트림 ... 그들은 당신이 읽고 개별 바이트 또는 바이트 배열 및 쓰기 보자

을하는 파일의 임의의 위치로 이동할 수 있습니다 ... 따라서 설명 된 사용 사례의 경우

  • 파일 열기 (읽기/쓰기 액세스 용)
  • 파일의 끝으로 이동
  • 뒤로 4 바이트 뒤로 이동 (어떤 항목인지 알고 있습니까?하지 않으면 것은,이
  • 새 사용자
  • 쓰기)을 숨길 수있는 좋은 시간이 될 네 개의 바이트

뭔가 같은 파일을 닫 작성합니다

using (var fs = new FileStream(PATH, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    fs.Seek(-4, SeekOrigin.End); 
    fs.Write(userBytes); 
    fs.Write(fourBytesAtEnd);  
} 

이것은 또한 전체 파일에서 쓰다가 다시 쓰지 않아도된다는 장점이 있습니다.

+0

이 시점에서 "4 바이트 뒤로 이동 (바이트는 파일 btw의 끝에 있습니다)"이러한 4 바이트는 어떻게됩니까? 삭제 되었습니까? 아니면 그냥 앞에 추가하여 끝까지 밀어 넣을 수 있습니까? 위의 코드도 추가했습니다. –

+0

4 바이트라는 것을 모릅니다. 5 또는 6 일 수 있습니다. 줄 종결자는 코드를 파손시킵니다. –

+0

16 진수 편집기에서 열었고 GUI를 통해 새 사용자를 추가하는 동작을 관찰했기 때문에 4 바이트라는 것을 알고 있습니다. –

4

명시 적으로 질문에 대답하려면 : 바이트 배열에서 바이트를 어떻게 제거하고 추가합니까?

새 배열을 만들고 바이트를 복사하면됩니다.

다행이이 Array.Resize()를 사용하여 단순화 :

byte[] array = new byte[10]; 
Console.WriteLine(array.Length); // Prints 10 
Array.Resize(ref array, 20);  // Copies contents of old array to new. 
Console.WriteLine(array.Length); // Prints 20 

당신이 처음부터 바이트를 제거해야하는 경우 - 첫번째 Array.Copy 바이트 및 크기 조정 (또는 ref을 좋아하지 않는 경우에 새로운 배열에 복사)보다 :

// remove 42 bytes from beginning of the array, add size checks as needed 
Array.Copy(array, 42, array, 0, array.Length-42); 
Array.Resize(ref array, array.Length-42); 
관련 문제