我认为我将自己与字节序和位移相混淆,请帮助。
我有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向左移位。
请指出我错在哪里。
答案 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]);
}