将8位int转换为32位

时间:2014-02-23 19:32:01

标签: c endianness

我认为我将自己与字节序和位移相混淆,请帮助。

我有4个8位整数,我想将其转换为32位整数。这就是我在做的事情:

uint h;
t_uint8 ff[4] = {1,2,3,4};

if (BIG_ENDIAN) {
    h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]);
}
else {
    h = ((int)ff[0] >> 24) | ((int)ff[1] >> 16) | ((int)ff[2] >> 8) | ((int)ff[3]);
}

然而,这似乎产生了错误的结果。通过一些实验,我意识到它应该是另一种方式:在大端的情况下,我应该将位移到右边,否则向左移位。但是,我不明白为什么。

这就是我理解的方式。 Big endian意味着最重要的字节优先(首先意味着最左边,对吗?也许这就是我错了)。因此,将8位int转换为32位int将在我现有的8位前加上24个零。因此,为了使其成为第1个字节,我需要将位24向左移位。

请指出我错在哪里。

1 个答案:

答案 0 :(得分:3)

您必须将8位值向左移动。但是在little-endian的情况下,你必须改变索引的顺序,这样第四个字节进入最重要的位置,第一个字节进入最不重要的位置。

if (BIG_ENDIAN) {
    h = ((int)ff[0] << 24) | ((int)ff[1] << 16) | ((int)ff[2] << 8) | ((int)ff[3]);
}
else {
    h = ((int)ff[3] << 24) | ((int)ff[2] << 16) | ((int)ff[1] << 8) | ((int)ff[0]);
}