-->

为什么前面加上的BinaryWriter胡言乱语到流的开始? 你如何避免呢?(Why does

2019-07-19 22:06发布

我调试一些问题,写作对象的件到一个文件,我已经得到了下来,只是打开该文件,并在其写入“TEST”的基本情况。 我被像这样:

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

w.Write("test");

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

不幸的是,这结束了前面加上一个框,该文件的前面,它看起来像这样:

TEST,与前面一个有趣的盒子。 这是为什么,我怎么能避免呢?

编辑:这似乎并没有在这里显示框,但它的Unicode字符,看起来像废话。

Answer 1:

他们不是字节顺序标记,但长度前缀,根据MSDN :

public virtual void Write(string value);

写入一个长度前缀字符串向[]流

你会需要一个长度前缀,如果你想读的字符串从这一点回来。 见BinaryReader.ReadString()

额外

因为它似乎你真正想要一个文件头检查

  1. 这是个问题吗? 你读的长度前缀后面,为的文件类型检查它的工作原理确定

  2. 您可以将字符串转换为byte []数组,可能使用Encoding.ASCII。 但母鸡,你必须要么使用一个固定的(隐含的)长度或...前缀它自己。 读取字节后[]您可以再次将其转换为字符串。

  3. 如果你有很多的文字来写,你甚至可以附加一个TextWriter以相同的流。 但要小心,作家要关闭其流。 我不会在一般建议这一点,但它是很好的了解。 这里也你必须标记一个点,其他的读者可以接管(固定头工作确定)。



Answer 2:

这是因为一个是的BinaryWriter写入字符串的二进制表示,包括字符串的长度。 如果你写直数据(例如字节[]等),这将不包括长度。

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();

你会发现,它不包括长度。 如果你要使用二进制作家在写文本数据,则需要先将其转换。



Answer 3:

在开始的一个字节是串的长度,它的写出来作为一个可变长度整数。

如果字符串是127个字符或更少,长度将被存储为一个字节。 当字符串击中128个字符,长度被写出为2,并且将在一些长度移动到图3和4,以及。

这里的问题是,你正在使用的BinaryWriter,其中写道指出BinaryReader在可以读回在后面的数据。 如果你想在自己的自定义格式写出来,你必须要么下降写作串那样的,或者使用的BinaryWriter完全放弃。



Answer 4:

正如在亨克指出此答案 ,这是字符串的长度(作为32位int)。

如果你不想这样,你可以写上“TEST”手动写的ASCII字符,每个字母作为字节,或者你可以使用:

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

和写所得阵列(其将不包含长度INT)



Answer 5:

你看到的其实是一个7位编码的整数,这是一种整数压缩 。
在预先准备的BinaryWriter文字与此,让读者(即BinaryReader在)会知道写串有多长。

  • BinaryWriter.Write7BitEncodedInt
  • BinaryReader.Read7BitEncodedInt

你可以阅读更多关于这个实施细则http://dpatrickcaldwell.blogspot.se/2011/09/7-bit-encoding-with-binarywriter-in-net.html 。



Answer 6:

你可以将其保存为UTF-8编码的字节数组是这样的:

...

BinaryWriter w = new BinaryWriter(fs);

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

...


Answer 7:

这是一个字节顺序标记,最有可能的。 这是因为流的编码设置为Unicode。



Answer 8:

请记住,Java字符串以UTF-16内部编码。

因此, “测试” 实际上是由字节为0xFF,0xFE的(一起字节顺序标记),0x74,0x00时,0x65,0×00(0x73)的,为0x00,0x74,0x00组成。

你可能想用字节而不是字符流工作。



Answer 9:

听起来像字节顺序标记。

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

也许你想写入字符串为UTF-8。



文章来源: Why does BinaryWriter prepend gibberish to the start of a stream? How do you avoid it?