我要调试一些问题写入一个象到一个文件,我已经得到了基地情况下的只是打开文件和书面"试验"。我这样做过这样的:

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

额外

由于看来你实际上想要的文件的标题检查

  1. 它是一个问题吗?你读的长-前缀回来,所以作为一种检查在该文件它的工作"确定"

  2. 你可以转换的串字节[]array,可能使用的编码。ASCII。但是母鸡,你必须要么使用一个固定的(隐含的)长度或者...前缀它自己。在读字节[]可以转换为一串。

  3. 如果你有一个很大的文本写你甚至可以附上一形式将相同的流。但是要小心,作家的想要接近他们的流。我不会建议这在一般情况下,但它是很好的知道。也在这里你将会有一点那里的其他读者可以采取在(固定头工作的确定)。

其他提示

这是因为一个的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组成。

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

听起来字节顺序标记。

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

也许要写入字符串作为UTF-8。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top