Tag: htonl

便携式C二进制序列化原语

据我所知,C库没有帮助将数值序列化为非文本字节流。 如我错了请纠正我。 使用的最标准工具是来自POSIX的htonl等人。 这些function有缺点: 没有64位支持。 没有浮点支持。 签名类型没有版本。 反序列化时,无符号到符号的转换依赖于有符号整数溢出,即UB。 它们的名称没有说明数据类型的大小。 它们依赖于8位字节和精确大小的uint_ N _t的存在。 输入类型与输出类型相同,而不是引用字节流。 这要求用户执行指针类型转换,这可能在对齐时不安全。 执行该类型转换后,用户可能会尝试在其本机内存布局中转换和输出结构,这种做法很糟糕,导致意外错误。 用于将任意大小的char化为8位标准字节的接口将落在C标准之间,该标准不真正确认8位字节,并且无论标准(ITU?)将八位位组设置为基本传输单位。 但旧的标准没有得到修订。 现在C11有许多可选组件,可以添加二进制序列化扩展以及线程之类的东西,而不需要对现有实现提出要求。 这样的扩展是否有用,或者担心非二进制补充机器是否毫无意义?

signed和unsigned int之间的强制转换是否在内存中保持变量的精确位模式?

我想通过套接字传递一个32位有符号整数x 。 为了让接收器知道期望哪个字节顺序,我在发送之前调用htonl(x) 。 虽然htonl需要一个uint32_t但我想确定当我将int32_t转换为uint32_t时会发生什么。 int32_t x = something; uint32_t u = (uint32_t) x; 总是这样的情况, x和u中的字节将完全相同吗? 怎么回事: uint32_t u = something; int32_t x = (int32_t) u; 我意识到负值会转换为大的无符号值,但这并不重要,因为我只是回到了另一端。 但是如果使用实际字节进行混乱,那么我无法确定返回将返回相同的值。