使用BinaryWriter计算存储字符串所需的字节数

时间:2017-06-07 01:06:29

标签: c# mono

我使用BinaryWriter将字符串写入文件。出于无关的原因,我需要计算这需要多少字节,但我看到的结果与文档不匹配。

使用此测试代码:

using (var stream = new FileStream(filePath, FileMode.Create)) {
    using (var writer = new BinaryWriter(stream)) {
        writer.Write("Test");
    }
}

我希望文件是8个字节:

  • 使用Encoding.UTF8.GetByteCount(str)(UTF-8是BinaryWriter使用的默认值),它报告字符串Test为4个字节。
  • According to the docs,BinaryWriter在输出字符串前面加上"无符号整数"这是4个字节。

但是,写入的文件只有5个字节,当我假设字符串总是Encoding.UTF8.GetByteCount(str) + 1个字节时,我的所有文件偏移量数学都有效。

我不清楚区别在哪里。

这是在Unity 5.6中测试的,它使用Mono / .NET 2.0和一些Mono / .NET 3.5。

1 个答案:

答案 0 :(得分:1)

我很惊讶文档说它写的大小未压缩。这是非常浪费的,我希望BinaryWriter.Write7BitEncodedInt提供长度压缩格式,对于127以下的整数,确实需要1个字节。

Reference code确认了期望:

 public unsafe virtual void Write(String value) 
 {
     ... 
     int len = _encoding.GetByteCount(value);
     Write7BitEncodedInt(len);