为什么BinaryWriter预先准备的胡言乱语来开始一个流?你怎么避免?
-
18-09-2019 - |
题
我要调试一些问题写入一个象到一个文件,我已经得到了基地情况下的只是打开文件和书面"试验"。我这样做过这样的:
static FileStream fs;
static BinaryWriter w;
fs = new FileStream(filename, FileMode.Create);
w = new BinaryWriter(fs);
w.Write("test");
w.Close();
fs.Close();
不幸的是,这结束了前添加一个盒子到前面的文件,而它看起来像这样:
测试,一个有趣的框在前面。这是为什么,我如何可以避免?
编辑:它似乎并不显示的箱子在这里,但这是unicode字,看起来像胡言乱语。
解决方案
他们不是字节以标记,但一个长-前缀,根据 MSDN:
public virtual void Write(string value);
写了一个长度为前缀的字符串 [的]流
你会需要那么长-前缀如果你想读串回从这一点。看看 BinaryReader.ReadString()
.
额外
由于看来你实际上想要的文件的标题检查
它是一个问题吗?你读的长-前缀回来,所以作为一种检查在该文件它的工作"确定"
你可以转换的串字节[]array,可能使用的编码。ASCII。但是母鸡,你必须要么使用一个固定的(隐含的)长度或者...前缀它自己。在读字节[]可以转换为一串。
如果你有一个很大的文本写你甚至可以附上一形式将相同的流。但是要小心,作家的想要接近他们的流。我不会建议这在一般情况下,但它是很好的知道。也在这里你将会有一点那里的其他读者可以采取在(固定头工作的确定)。
其他提示
这是因为一个的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();
您会发现,它不包括长度。如果你要使用二进制作家在写文本数据,则需要先将其转换。
在开始的一个字节是串的长度,它的写出来作为一个可变长度整数。
如果字符串是127个字符或更少,长度将被存储为一个字节。当字符串击中128个字符,长度被写出为2,并且将在一些长度移动到图3和4,以及
这里的问题是,你正在使用的BinaryWriter,其中写道指出BinaryReader在可以读回在后面的数据。如果你想在自己的自定义格式写出来,你必须要么下降写作串那样的,或者使用的BinaryWriter干脆放弃。
作为Henk指出 这个答案, 这是一长串(作为一个32位int)。
如果你不想要这个,你可以写"测试"手写的ASCII字每个字母为字,或者你可以使用:
System.Text.Encoding.UTF8.GetBytes("TEST")
写得到的数组(其中将不包含一个长int)
你现在看到的实际上是一个7位编码的整数,这是一种 整压缩.
该BinaryWriter预先准备的文本,这使读者(即BinaryReader)将知道如何长的书面串。
你可以读取更多的有关执行情况的详细信息,这在 http://dpatrickcaldwell.blogspot.se/2011/09/7-bit-encoding-with-binarywriter-in-net.html.
可以将其保存为UTF8编码的字节数组是这样的:
...
BinaryWriter w = new BinaryWriter(fs);
w.Write(UTF8Encoding.Default.GetBytes("test"));
...
这是一个字节顺序标记,最有可能的。这是因为该流的编码设置为Unicode。
请记住,Java字符串在UTF-16内部编码。
因此, “测试” 实际上是由字节0xff的,0xFE的(共同的字节顺序标记),0x74,0x00时,0x65,0×00(0x73)的,0×00,0x74,0x00组成。
您可能想用字节而不是字符流工作。