c - C 中的 Endian 转换有符号

标签 c unix

我试图在大端格式的文件中写入有符号整数值。

我正在使用这段代码:

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/

相关文章:

无法在 TreeView 中切换复选框

c - 在 C 中执行程序,不要等待它完成

linux - ffmpeg 关闭并返回代码 137

perl - 如何检查哪种检查端口状态的方法更有效?

c - 如何使多个全局变量对 C 中的其他模块只读?

objective-c - 将 "hello world"扩展为 HelloWorld 的 C 预处理器宏

linux - 不能添加超过 2 个变量

c - 如何将包含通配符的路径转换为 ​​C 程序中相应的文件条目?

c - 初始化的字符数组指向同一内存

c - 内存映射文件无法在不取消映射的情况下关闭,因为它仍然被引用