Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用hton[l|ll]和memcpy将有符号整数打包到网络数据包中是否安全_C_Network Programming - Fatal编程技术网

使用hton[l|ll]和memcpy将有符号整数打包到网络数据包中是否安全

使用hton[l|ll]和memcpy将有符号整数打包到网络数据包中是否安全,c,network-programming,C,Network Programming,IETF标准化的协议在将整数打包到网络数据包中时倾向于使用大端字节顺序,并明确提到这一点,但使用有符号整数的IETF协议,例如,似乎对有符号整数在导线上的表示方式没有说明,我们是否应该假设二的补码 在C中打包有符号整数时,是否可以将其转换为相同宽度的无符号整数,并使用标准的hton()/htonl()/htonl()和memcpy()combo?为什么标记为C11甚至C?C标准对网络没有任何规定。uinteger=(uint32_t)-sinteger;uinteger |=0x8000000看

IETF标准化的协议在将整数打包到网络数据包中时倾向于使用大端字节顺序,并明确提到这一点,但使用有符号整数的IETF协议,例如,似乎对有符号整数在导线上的表示方式没有说明,我们是否应该假设二的补码


在C中打包有符号整数时,是否可以将其转换为相同宽度的无符号整数,并使用标准的
hton()/htonl()/htonl()
memcpy()
combo?

为什么标记为C11甚至C?C标准对网络没有任何规定。
uinteger=(uint32_t)-sinteger;uinteger |=0x8000000看起来不对。它正在将第二行代码中的
[1…0x7FFFFFFF,0x8000000]
映射到
[0x8000001…0xFFFFFF,0x8000000]
。你想在这里干什么?我希望
uinteger=0x7fffffffusinteger@JensGustedt示例代码是C。不确定C标准是否讨论了整数在内存中的布局,以及它们的符号应该如何表示。@chux uinteger=(uint32_t)-sinteger取消符号位的设置,并将无符号值赋给32位整数。uinteger |=0x8000000设置最高有效字节的最高有效位。问题的关键在于确定直接将带符号整数复制到数据包中是否安全,或者是否需要做额外的工作,因为内存中符号的表示形式可能会在系统之间发生变化。“uinteger=(uint32_t)-sinteger会取消符号位的设置”当
sinteger==0x80000000
时不正确。为什么标记为C11甚至C?C标准对网络没有任何规定。
uinteger=(uint32_t)-sinteger;uinteger |=0x8000000看起来不对。它正在将第二行代码中的
[1…0x7FFFFFFF,0x8000000]
映射到
[0x8000001…0xFFFFFF,0x8000000]
。你想在这里干什么?我希望
uinteger=0x7fffffffusinteger@JensGustedt示例代码是C。不确定C标准是否讨论了整数在内存中的布局,以及它们的符号应该如何表示。@chux uinteger=(uint32_t)-sinteger取消符号位的设置,并将无符号值赋给32位整数。uinteger |=0x8000000设置最高有效字节的最高有效位。问题的关键在于确定将带符号整数直接复制到数据包中是否安全,或者是否需要做额外的工作,因为符号的内存表示形式可能会在系统之间发生变化。
sinteger==0x8000000
时,“uinteger=(uint32_t)-sinteger取消设置符号位”不是真的。