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

C# 使用BinaryWriter计算存储字符串所需的字节,c#,mono,C#,Mono,我正在使用BinaryWriter将字符串写入文件。出于不相关的原因,我需要计算这将需要多少字节,但我看到的结果与文档不匹配 使用此测试代码: using (var stream = new FileStream(filePath, FileMode.Create)) { using (var writer = new BinaryWriter(stream)) { writer.Write("Test"); } } 我希望该文件为8个字节: 使用Encodi

我正在使用
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),它报告字符串
    Test
    为4个字节
  • ,BinaryWriter在输出字符串前面加上一个4字节的“无符号整数”
但是,写入的文件只有5个字节,当我假设字符串总是
Encoding.UTF8.GetByteCount(str)+1
字节时,我所有的文件偏移量数学都可以工作

我不清楚区别在哪里


Unity 5.6使用Mono/.NET 2.0和一些Mono/.NET 3.5对这一点进行了测试。

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

确认这一期望:

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

您可能还想检查整数是如何写入的(紧凑格式类似于UTF8)-啊,可能就是这样。“如果值适合七位,则只需要一个字节的空间”。这将使我确定偏移量的数学变得复杂。我当然希望有一种更简单的方法来计算BinaryWriter将使用多少空间,而无需复制逻辑。您可以始终编写一次,只需收集大小信息。。。或者只是重写写字符串,写你喜欢的方式(你也必须匹配读)。我甚至没有考虑到int将写不同的,所以很好的捕捉。接下来,对于我来说,计算所需的真实字节的最佳方法是什么
sizeof
不考虑这种书写方法。有什么事吗?我不这么认为。我会复制Write7Bitencodeint并修改它,使其只计算字节数。很简单,这就是我所做的。知道为什么这种7Bit编码只用于字符串长度int吗?为什么没有int32呢?我猜字符串通常足够短,所以额外3个字节的成本很容易被注意到(比如单词列表会有25%的额外字节浪费在长度上),而所有其他用法都不那么清晰。如果你知道你的整数足够小,你也可以用write7bitencodeint来写它们。