質問

私は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());
}

ASCII文字を3つしか書き込んでいないのに、なぜ文字列のオーバーロードが4バイトを書き込むのか理解できません。誰でもこれを説明できますか?

他のヒント

BinaryWriter.Write(string)からドキュメント

BinaryWriterの現在のエンコーディングでこのストリームに length-prefixed 文字列を書き込み、使用されているエンコーディングとストリームに書き込まれている特定の文字に従ってストリームの現在の位置を進めます。

この動作はおそらく、 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);
}

実際に書かれたものを見ましたか? nullターミネーターを推測します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top