我正在尝试做一些我认为非常基本的事情,但要么我只是忽略了一些明显的东西,要么实际上有点棘手。我的问题是:我有一个包含4个十六进制值的4个字符数组。例如:
array[0] = 0xD8
array[1] = 0xEC
array[2] = 0xA2
array[3] = 0x83
我想将这个数组存储在一个带有组合值的整数中,在本例中为0xD8ECA283
我尝试过逻辑OR,然后移位这个方法,我设法将0xD8的值存储在整数中,但不是其余的。任何提示将不胜感激。
答案 0 :(得分:5)
使用二进制或运算符,以及一个整数,其精度保证至少为32位,这是unsigned long类型(尽管也可以使用uint_least32_t类型)。
使用无符号整数,因此避免了在移位有符号整数时出现的任何潜在的未定义和/或实现定义的行为。
此解决方案与字节顺序无关。
unsigned long a = ( ( ( unsigned long )array[0] & 0xFF ) << 24 ) |
( ( ( unsigned long )array[1] & 0xFF ) << 16 ) |
( ( ( unsigned long )array[2] & 0xFF ) << 8 ) |
( ( ( unsigned long )array[3] & 0xFF ) << 0 ) ;
转化为( unsigned long )
是为了避免中间隐式转换为int
& 0xFF
操作用于删除不必要的位(如果在不太可能的情况下有任何CHAR_BIT!= 8)。
答案 1 :(得分:4)
这应该这样做:
int i;
int combined = 0;
for (i = 0; i < 4; i++) {
combined = (combined << 8) | ((unsigned char) array[i]);
}