将int转换为char数组Big Endian

时间:2014-03-14 09:12:17

标签: c arrays endianness

我在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机器上,它是否以大端方式存储缓冲区数?如果有,为什么?

4 个答案:

答案 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)