System.io.binarywriter를 사용한 문자열 대 char 배열의 차이
-
06-07-2019 - |
문제
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);
}
실제로 작성된 내용을 보셨습니까? 나는 널 터미네이터를 추측 할 것입니다.