gpt4 book ai didi

C# BinaryWriter 写入方法字符串大小

转载 作者:行者123 更新时间:2023-11-30 23:07:22 42 4
gpt4 key购买 nike

使用 C# 将字符串写入二进制文件时,长度(以字节为单位)会自动添加到输出中。根据MSDN documentation这是一个无符号整数,但也是一个字节。他们给出的示例是单个 UTF-8 字符将是三个写入字节:1 个大小字节和 2 个字符字节。这适用于长度不超过 255 的字符串,并且与我观察到的行为相匹配。

但是,如果您的字符串超过 255 个字节,则无符号整数的大小会根据需要增加。作为一个简单的例子,将 1024 个字符视为:

string header = "ABCDEFGHIJKLMNOP";
for (int ii = 0; ii < 63; ii++)
{
header += "ABCDEFGHIJKLMNOP";
}
fileObject.Write(header);

在字符串前面加上 2 个字节的结果。创建一个 2^17 长度的字符串会产生一个有点令人抓狂的 3 字节数组。

那么问题来了,读取时如何知道要读取多少字节才能得到后面的内容的大小呢?我不一定先验知道 header 大小。最终,我能否强制 Write(string) 方法始终使用一致的大小(比如 2 个字节)?

一个可能的解决方法是编写我自己的 write(string) 方法,但出于明显的原因我想避免这种情况(类似问题 herehere 接受这个作为答案)。另一个更可口的解决方法是让读者寻找启动 ASCII 字符串信息的特定字符(可能是不可打印的字符?),但这并非万无一失。最后一个解决方法(我能想到的)是强制字符串在特定大小字节数的大小范围内;同样,这也不理想。

虽然强制字节数组的大小保持一致是最简单的,但我可以控制读取器,因此也欢迎任何聪明的读取器解决方案。

最佳答案

BinaryWriterBinaryReader 不是写入二进制数据的唯一方式;简单地说:它们提供了一个在特定读者和作者之间共享的约定。不,你不能告诉他们使用另一个约定——当然除非你将它们都子类化并完全覆盖 ReadStringWrite(string) 方法。

如果您想使用不同的约定,那么只需:不要使用 BinaryReaderBinaryWriter。直接使用任何文本 EncodingStream 对话非常容易,您可以获取字节数和字节数。然后您可以使用任何您想要的约定。如果您只需要写入最大 65k 的字符串,那么确定:使用固定的 2 个字节(unsigned short)。当然,您还需要决定哪个字节先出现(“字节顺序”)。

至于前缀的大小:本质上是使用:

int byteCount = this._encoding.GetByteCount(value);
this.Write7BitEncodedInt(byteCount);

与:

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

这种类型的长度编码很常见 - 它与 "varint" that "protobuf" uses 的想法相同,例如(base-128,最低有效组在前,保留7位组中的位顺序,第8位作为延续)

关于C# BinaryWriter 写入方法字符串大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47409296/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com