c - 整数到字节数组 Little Endian,反之亦然

标签 c bit-manipulation

我想要将整数转换为字节数组(小端)的方法, 以及从字节数组(以小端方式编码)到 C 中的整数; 无论我们是在 LE 还是 BE 机器上工作。

这些函数适合这个吗?

void Int2ByteArrayLE(int x,unsigned char *byteArray)
{

  byteArray[0]=x;
  byteArray[1]=x>>8;
  byteArray[2]=x>>16;
  byteArray[3]=x>>24;
}


void ByteArrayLE2Int(unsigned char *byteArray, int*x)
{
  *x=byteArray[0] | (byteArray[1]<<8) | (byteArray[2]<<16) | (byteArray[3]<<24);
}

PS。如果 x 已签名,这也有效吗?

最佳答案

您实际上想要做的是在主机字节顺序和网络字节顺序之间进行转换。为此,您需要函数 htonlntohl

要将主机字节顺序转换为网络字节顺序,请使用:

uint32_t n = (uint32_t)htonl((uint32_t)h);

相反的方向:

int h = (int)ntohl((uint32_t)n);

这些函数了解主机平台的字节顺序。因此,如果您在大端机器上执行代码,这些函数将不会执行任何操作。但在小端机器上,函数会反转字节。

在评论中,您暗示您的通信协议(protocol)要求信息以小端字节顺序传递。这肯定是一个错误。您应该遵循标准协议(protocol)并按照网络字节顺序在线路上传输数据。

如果您确实无法更改协议(protocol),并且需要通过网络传输小端字节序,那么您只需要一个 memcpy。您的值已经是小尾数,显然反转字节不会有帮助。

如果您发现自己使用的是大端客户端,那么您现在当然需要反转字节。使用此功能:

uint32_t reverseBytes32(uint32_t v){
  return ((v & 0xFF) << 24) | ((v & 0xFF00) << 8) 
         | ((v & 0xFF0000) >> 8) | ((v & 0xFF000000) >> 24);
}

您需要使用强制转换将签名的 int 重新解释为无符号的 uint32_t

关于c - 整数到字节数组 Little Endian,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22605399/

相关文章:

c++ - 连接c/c++和python

c++ - 移位可移植性

c - 如何在Ubuntu 14.04上安装Frama-c影响分析插件?

c - 除了用作全局变量之外,如何使用 'flag' 变量?

c - 执行信号操作时发出无关信号

javascript - 如何消除按位循环并将字节作为一个整体处理?

c++ - 如何测试一个数字是否是 2 的幂?

c - 钳制真实(固定/浮点)值的最快方法?

java - 为什么 (int) (Math.random() * 0xFFFFFFFF) 是 0

c - 带有 objcopy 的巨大二进制文件