14

オブジェクトの一部をファイルに書き込む際のいくつかの問題をデバッグしていて、ファイルを開いて「TEST」を書き込むという基本的なケースにたどり着きました。私はこれを次のような方法で行っています:

static FileStream fs;
static BinaryWriter w;
fs = new FileStream(filename, FileMode.Create);
w = new BinaryWriter(fs);

w.Write("test");

w.Close();
fs.Close();

残念ながら、これはファイルの先頭にボックスを追加することになり、次のようになります。

前面に楽しいボックスを備えたテスト。これはなぜですか、どうすれば回避できますか?

編集:ここにはボックスが表示されていないようですが、ぎこちないように見えるのはユニコード文字です。

4

9 に答える 9

23

MSDNによると、これらはバイト順のマークではなく、長さのプレフィックスです。

public virtual void Write(string value);

長さのプレフィックスが付いた文字列を[the]ストリームに書き込みます

また、その時点から文字列を読み戻したい場合は、その長さプレフィックスが必要になります。を参照してくださいBinaryReader.ReadString()

追加

実際にはファイルヘッダーチェッカーが必要なようですので

  1. それって問題ですか?長さプレフィックスを読み返して、ファイルのタイプチェックとして正常に機能するようにします

  2. おそらくEncoding.ASCIIを使用して、文字列をbyte[]配列に変換できます。ただし、固定の(暗黙の)長さを使用するか、自分でプレフィックスを付ける必要があります。byte []を読み取った後、それを再び文字列に変換できます。

  3. 書き込むテキストが多い場合は、同じストリームにTextWriterをアタッチすることもできます。ただし、ライターはストリームを閉じたいので注意してください。一般的にはアドバイスしませんが、知っておくとよいでしょう。ここでも、他のリーダーが引き継ぐことができるポイントをマークする必要があります(固定ヘッダーは正常に機能します)。

于 2009-09-28T18:16:15.527 に答える
8

これは、BinaryWriterが文字列の長さを含む文字列のバイナリ表現を書き込んでいるためです。ストレートデータ(たとえば、byte []など)を書き込む場合、その長さは含まれません。

byte[] text = System.Text.Encoding.Unicode.GetBytes("test");
FileStream fs = new FileStream("C:\\test.txt", FileMode.Create);
BinaryWriter writer = new BinaryWriter(fs);
writer.Write(text);
writer.Close();

長さが含まれていないことに気付くでしょう。バイナリライターを使用してテキストデータを書き込む場合は、最初に変換する必要があります。

于 2009-09-28T18:23:02.340 に答える
8

先頭のバイトは文字列の長さで、可変長整数として書き出されます。

文字列が127文字以下の場合、長さは1バイトとして格納されます。文字列が128文字に達すると、長さは2と書き出され、一部の長さでも3と4に移動します。

ここでの問題は、BinaryReaderが後で読み戻すことができるデータを書き出すBinaryWriterを使用していることです。独自のカスタム形式で書き出す場合は、そのような書き込み文字列を削除するか、BinaryWriterを使用して完全に削除する必要があります。

于 2009-09-28T18:27:56.497 に答える
6

ヘンクがこの回答で指摘したように、これは文字列の長さです(32ビット整数として)。

これが不要な場合は、各文字のASCII文字をバイト単位で書き込むことにより、手動で「TEST」を書き込むか、次を使用できます。

System.Text.Encoding.UTF8.GetBytes("TEST")

そして、結果の配列を書き込みます(長さintは含まれません)

于 2009-09-28T18:21:48.113 に答える
2

表示されているのは、実際には7ビットでエンコードされた整数です。これは一種の整数圧縮です。
BinaryWriterはこれをテキストの前に追加して、リーダー(つまり、BinaryReader)が書き込まれた文字列の長さを認識できるようにします。

この実装の詳細については、http://dpatrickcaldwell.blogspot.se/2011/09/7-bit-encoding-with-binarywriter-in-net.htmlを参照してください。

于 2013-07-27T01:27:34.463 に答える
0

次のように、UTF8でエンコードされたバイト配列として保存できます。

...

BinaryWriter w = new BinaryWriter(fs);

w.Write(UTF8Encoding.Default.GetBytes("test"));

...
于 2009-09-28T18:29:47.443 に答える
-1

Java文字列はUTF-16で内部的にエンコードされていることに注意してください。

したがって、「テスト」は実際にはバイト0xff、0xfe(バイト順マークを合わせて)、0x74、0x00、0x65、0x00、0x73、0x00、0x74、0x00で構成されます。

文字のストリームではなく、バイトを使用することをお勧めします。

于 2009-09-28T18:25:22.730 に答える
-1

これはおそらくバイト順マークです。これは、ストリームのエンコーディングがUnicodeに設定されているためです。

于 2009-09-28T18:07:21.140 に答える
-2

バイト順マークのように聞こえます。

http://en.wikipedia.org/wiki/Byte-order_mark

おそらく、文字列をUTF-8として記述したいと思うでしょう。

于 2009-09-28T18:06:59.563 に答える