我试图在大端格式的文件中写入有符号整数值。
我正在使用这段代码:
int32_t swap_int32( int32_t val )
{
val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF );
return (val << 16) | ((val >> 16) & 0xFFFF);
}
它在负值下工作正常,但在正值下我遇到了一些问题:
-5 给我:
$> hexdump OUTPUT
ff ff ff fb
哪个是正确的
但是 1337 给了我:
$> hexdump OUTPUT
00 00 05 39
而不是(预期的)00 00 39 05。
有没有办法同时处理这两种情况并得到正确的结果? 谢谢你。
最佳答案
使用 htonl 有问题吗? ?
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
字节中的值应该保持不变,所以即使您想要一个带符号的值并且 htonl 取一个无符号的,只要您将它读回带符号的类型,您就不会丢失数据。 (正如 mctylr 所指出的,网络顺序是 big-endian。)
#include <arpa/inet.h>
#include <stdio.h>
int main(int argc, char** argv) {
int32_t pos = 1337;
int32_t neg = -123;
printf("host-endian: %d => 0x%08x %d => 0x%08x \n",
pos, pos, neg, neg);
uint32_t big_endian_pos = htonl(pos);
uint32_t big_endian_neg = htonl(neg);
printf("Big-endian: %d => 0x%08x %d => 0x%08x \n",
pos, big_endian_pos, neg, big_endian_neg);
}
以及我的小端主机上的输出:
[tmp]$ gcc endian.c && ./a.out
host-endian: 1337 => 0x00000539 -123 => 0xffffff85
Big-endian: 1337 => 0x39050000 -123 => 0x85ffffff
关于c - C 中的 Endian 转换有符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8537689/