我想要将整数转换为字节数组(小端)的方法, 以及从字节数组(以小端方式编码)到 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 已签名,这也有效吗?
最佳答案
您实际上想要做的是在主机字节顺序和网络字节顺序之间进行转换。为此,您需要函数 htonl
和 ntohl
。
要将主机字节顺序转换为网络字节顺序,请使用:
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/