将8字节char数组转换为long

时间:2015-06-08 23:11:19

标签: c arrays types shift

我们如何将8字节的char数组转换为long,因为<<对于long类型不起作用?

#define word_size 8

long num = 0;
char a[word_size] = "\x88\x99\xaa\x0bb\xcc\xdd\xee\xff";

for (i=0; i < word_size;i++) {
   a[(word_size-1) - i] |= (num << (8*(word_size - i - 1))) & 0xFF;
}

printf("%lx\n", num);

1 个答案:

答案 0 :(得分:3)

以下代码效率更高:

unsigned char[word_size] = ...;
int64_t num = 0;
for ( int i = 0 ; i < sizeof(a) ; i++ )
    num = (num << 8) | a[i];

这假定数组中字节的大端(最高字节优先)排序。对于小端(如您所示),只需自上而下处理:

for ( int i = sizeof(a) ; --i >= 0 ; )

注意:char是有符号还是无符号是依赖于实现的,因此将其指定为无符号,否则逻辑 - 或将无效。更好地使用uint8_t;定义为8位,而char

注意:对于常量,应使用全大写:WORD_SIZE而不是word_size。这是一个普遍接受的标准(C中标识符的唯一情况)。