【发布时间】:2012-07-15 01:42:55
【问题描述】:
据我所知,C 库在将数值序列化为非文本字节流方面没有提供任何帮助。如果我错了,请纠正我。
使用最标准的工具是来自 POSIX 的 htonl 等。这些函数都有缺点:
- 不支持 64 位。
- 不支持浮点数。
- 没有签名类型的版本。反序列化时,无符号到有符号的转换依赖于有符号整数溢出,即 UB。
- 它们的名称并未说明数据类型的大小。
- 它们取决于 8 位字节和精确大小的 uint_N_t。
- 输入类型与输出类型相同,而不是引用字节流。
- 这需要用户执行指针类型转换,这可能是不安全的对齐方式。
- 执行该类型转换后,用户可能会尝试在其本机内存布局中转换和输出结构,这种不良做法会导致意外错误。
用于将任意大小的char 序列化为 8 位标准字节的接口介于 C 标准之间,该标准并不真正承认 8 位字节,而任何标准(ITU?)将八位字节设置为传输的基本单位。但旧标准没有得到修订。
现在 C11 有许多可选组件,二进制序列化扩展可以与线程之类的东西一起添加,而不需要对现有实现提出要求。
这样的扩展会有用吗,还是担心非二进制补码机器就没有意义?
【问题讨论】:
-
关于
hton?/ntoh?和名称中的大小,实际上名称中的大小是。最后一个字母是大小,s代表short,l代表long。 -
@JoachimPileborg 除了
long在许多系统上是 64 位,非 8 位字节的系统不可能完全匹配 16 位short或 32 位long。 C 标准故意模棱两可。 -
它可以作为一个外部库用于它可能工作的平台。我看不出这种语言有什么好处。如果我在 IBM 大型机上,接收您的 IEEE 浮点格式是没有用的。文本表示会更容易处理。
-
您的可移植性要求非 IEEE 系统支持与非本地浮点格式之间的转换。这不是我想要的语言标准。
-
htonl 等人不“就地操作”;他们返回转换后的结果而不改变输入值
标签: c portability binaryfiles endianness htonl