我在SO上找到了这个代码。
unsigned char * SerializeInt(unsigned char *buffer, int value)
{
/* Write big-endian int value into buffer; assumes 32-bit int and 8-bit char. */
buffer[0] = value >> 24;
buffer[1] = value >> 16;
buffer[2] = value >> 8;
buffer[3] = value;
return buffer + 4;
}
您可以看到代码声称它正在以Big Endian方式将整数写入缓冲区。
我的问题是:这个函数在Little endian和Big endian机器上都能正常工作吗? 换句话说,在LE和BE机器上,它是否以大端方式存储缓冲区数?如果有,为什么?
答案 0 :(得分:4)
无论系统的字节顺序是什么,您的SerializeInt
函数都会将value
存储在数组buffer
中的大端。它存储为大端,因为它首先写入最重要的字节。请记住,当您评估value
时,它本身没有字节序 ,就像任何数学值一样。
答案 1 :(得分:1)
代码将始终以big-endian方式在integer
数组中编写char
。这是因为您总是在buffer[0]
保存MSB,在buffer[3]
保存LSB。
假设在一个小端机器中:
您的号码为0x11223344
:(十六进制格式)
Address -> 2003 2002 2001 2000
`int` Number -> 11 22 33 44
Buffer -> index[3] [2] [1] [0]
大端机器上的相同表示形式为:
Address -> 2000 2001 2002 2003 <= See only the addressing changed/reversed
`int` Number -> 11 22 33 44
Buffer -> index[3] [2] [1] [0]
在两台机器中,integer << 24
表示MSB,(int8_t)integer
表示LSB。
答案 2 :(得分:0)
Big-Endian被定义为,大端(即最高位/字节)首先。所以,是的,该函数将value
以big-endian格式写入buffer
。
然而,将一个指针返回缓冲区会让我觉得异常。
答案 3 :(得分:0)
除了已发布的关于endianess的答案......
这个功能在Little endian和Big endian机器上都能正常工作吗?
不,因为您对默认的int
类型使用逐位算术。如果int
为负数,则行为是实现定义的。一般来说,在有符号整数上使用逐位运算符没有任何意义。
此外,您的代码依赖于int
为32位,其中没有任何保证。
因此,您的代码完全不可移植。按以下方式修复它:
#include <stdint.h>
uint8_t* SerializeInt (uint8_t* buffer, uint32_t value)