使用 BinaryWriter 计算存储字符串所需的字节数
Calculating bytes needed to store a string using BinaryWriter
我正在使用 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 在输出字符串前加上一个 "unsigned integer" 前缀,它是 4 个字节。
但是,写入的文件只有 5 个字节,并且当我假设字符串始终为 Encoding.UTF8.GetByteCount(str) + 1
字节时,我所有的文件偏移数学运算都有效。
我不清楚区别在哪里。
这正在 Unity 5.6 中进行测试,它使用 Mono/.NET 2.0 和一些 Mono/.NET 3.5。
我很惊讶文档说它写入未压缩的大小。这是非常浪费的,我希望 BinaryWriter.Write7BitEncodedInt 提供的长度压缩格式确实需要 1 个字节用于小于 127 的整数。
Reference code 证实了预期:
public unsafe virtual void Write(String value)
{
...
int len = _encoding.GetByteCount(value);
Write7BitEncodedInt(len);
我正在使用 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 在输出字符串前加上一个 "unsigned integer" 前缀,它是 4 个字节。
但是,写入的文件只有 5 个字节,并且当我假设字符串始终为 Encoding.UTF8.GetByteCount(str) + 1
字节时,我所有的文件偏移数学运算都有效。
我不清楚区别在哪里。
这正在 Unity 5.6 中进行测试,它使用 Mono/.NET 2.0 和一些 Mono/.NET 3.5。
我很惊讶文档说它写入未压缩的大小。这是非常浪费的,我希望 BinaryWriter.Write7BitEncodedInt 提供的长度压缩格式确实需要 1 个字节用于小于 127 的整数。
Reference code 证实了预期:
public unsafe virtual void Write(String value)
{
...
int len = _encoding.GetByteCount(value);
Write7BitEncodedInt(len);