差异书面字符串与字符数组与System.IO.BinaryWriter(Difference in

2019-09-16 12:34发布

我写的文字在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());
}

我不明白为什么字符串超载时,我只写3个ASCII字符写入4个字节。 任何人都可以解释一下吗?

Answer 1:

为文档BinaryWriter.Write(string)指出,它写入一个长度前缀字符串此流。 在过载能力Write(char[])没有这样的前缀。

这似乎对我来说,额外的数据长度。

编辑:

只是要一点更加明确,使用反射器。 你会看到它有这段代码中有作为的一部分Write(string)方法:

this.Write7BitEncodedInt(byteCount);

它是编码使用的字节的最小可能数目的整数的一种方式。 为短字符串(即我们将使用每天是小于128个字符),它可以利用一个字节表示。 对于更长的字符串,它开始使用更多的字节。

下面是这个函数以防万一你有兴趣的代码:

protected void Write7BitEncodedInt(int value)
{
    uint num = (uint) value;
    while (num >= 0x80)
    {
        this.Write((byte) (num | 0x80));
        num = num >> 7;
    }
    this.Write((byte) num);
}

使用这种编码的前缀的长度后,将其写入在所希望的编码的字符的字节。



Answer 2:

BinaryWriter.Write(string) 文档 :

写入一个长度前缀字符串这个流中的的BinaryWriter的当前编码,并前进根据所使用的编码和所述特定字符的流的当前位置被写入到该流。

这种现象可能是使读取文件早在使用时BinaryReader字符串可以被识别。 (如3Foo3Bar6Foobar可以被解析成字符串“富”,“酒吧”和“Foobar的”,但FooBarFoobar不可能。)事实上, BinaryReader.ReadString正是利用这些信息来读取string从二进制文件。

BinaryWriter.Write(char[]) 文档 :

写入一个字符阵列到当前流并前进根据所使用的编码和所述特定字符的流的当前位置被写入到该流。

这是很难夸大全面和有益的MSDN上的文档怎么样了。 总是先检查。



Answer 3:

如前所述,BinaryWriter.Write(String)写入字符串的长度流,写入字符串本身之前。

这使得BinaryReader.ReadString()了解串有多长。

using (BinaryReader br = new BinaryReader(File.OpenRead("data.dat")))
{
    string foo1 = br.ReadString();
    char[] foo2 = br.ReadChars(3);
}


Answer 4:

你看看什么是真正写的? 我猜一空终止符。



文章来源: Difference in writing string vs. char array with System.IO.BinaryWriter