문제

C#의 이진 파일에 텍스트를 작성하고 문자열을 쓰는 것과 문자 배열 사이에 쓰여진 수량의 차이를 봅니다. 나는 System.io.binarywriter를 사용하고 있으며 Binarywriter.basestream.length가 글이 발생하는대로보고 있습니다. 이것들은 내 결과입니다.

using(BinaryWriter bw = new BinaryWriter(File.Open(“data.dat”), Encoding.ASCII))
{
  string value = “Foo”;

  // Writes 4 bytes
  bw.Write(value);

  // Writes 3 bytes 
  bw.Write(value.ToCharArray());
}

나는 String Overload가 3 개의 ASCII 문자 만 쓸 때 4 바이트를 쓸 이유를 이해하지 못합니다. 누구든지 이것을 설명 할 수 있습니까?

도움이 되었습니까?

해결책

문서 BinaryWriter.Write(string) 이 스트림에 길이가 정해진 문자열을 씁니다. 과부하 Write(char[]) 그러한 접두사가 없습니다.

추가 데이터가 길이 인 것 같습니다.

편집하다:

조금 더 명백한 반사기를 사용하십시오. 당신은 그것이이 코드의 일부로이 코드를 가지고 있음을 알게 될 것입니다. Write(string) 방법:

this.Write7BitEncodedInt(byteCount);

최소 수의 바이트를 사용하여 정수를 인코딩하는 방법입니다. 짧은 문자열의 경우 (매일 128 자 미만인 매일 사용) 하나의 바이트를 사용하여 표현할 수 있습니다. 더 긴 문자열의 경우 더 많은 바이트를 사용하기 시작합니다.

관심있는 경우를 대비하여 해당 기능의 코드는 다음과 같습니다.

protected void Write7BitEncodedInt(int value)
{
    uint num = (uint) value;
    while (num >= 0x80)
    {
        this.Write((byte) (num | 0x80));
        num = num >> 7;
    }
    this.Write((byte) num);
}

이 인코딩을 사용하여 길이를 접두사 한 후 원하는 인코딩의 문자에 대한 바이트를 씁니다.

다른 팁

로부터 BinaryWriter.Write(string) 문서:

a 길이가 정해져 있습니다 바이너리 라이터의 현재 인코딩 에서이 스트림에 문자열을하고 사용 된 인코딩 및 스트림에 기록되는 특정 문자에 따라 스트림의 현재 위치를 발전시킵니다.

이 동작은 아마도 파일을 다시 읽을 때 BinaryReader 문자열을 식별 할 수 있습니다. (예 : 3Foo3Bar6Foobar "foo", "bar"및 "foobar"로 구문 분석 할 수 있지만 FooBarFoobar 할 수 없었습니다.) 사실, BinaryReader.ReadString 이 정보를 정확히 사용하여 읽습니다 string 이진 파일에서.

로부터 BinaryWriter.Write(char[]) 문서:

캐릭터 배열을 현재 스트림에 쓰고 사용 된 인코딩 및 스트림에 기록되는 특정 문자에 따라 스트림의 현재 위치를 발전시킵니다.

MSDN의 문서가 얼마나 포괄적이고 유용한 지 과장하기는 어렵습니다. 항상 먼저 확인하십시오.

이미 언급했듯이 BinaryWriter.write (String)는 문자열 자체를 작성하기 전에 스트림에 문자열의 길이를 씁니다.

이를 통해 BinaryReader.ReadString ()은 문자열의 시간을 알 수 있습니다.

using (BinaryReader br = new BinaryReader(File.OpenRead("data.dat")))
{
    string foo1 = br.ReadString();
    char[] foo2 = br.ReadChars(3);
}

실제로 작성된 내용을 보셨습니까? 나는 널 터미네이터를 추측 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top