将 8 字节 char 数组转换为 long

Urs*_*jor 1 c arrays types shift

<<由于不适用于 long 类型,我们如何将 8 字节 char 数组转换为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);
Run Code Online (Sandbox Code Playgroud)

too*_*ite 5

下面的代码效率更高:

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

这假定数组中字节的大端顺序(最高阶字节在前)。对于小端(正如您所使用的),只需自上而下地处理它:

for ( int i = sizeof(a) ; --i >= 0 ; )
Run Code Online (Sandbox Code Playgroud)

注意:是否char有符号或无符号取决于实现,因此请确定为无符号,否则逻辑或将不起作用。更好地使用uint8_t;被定义为8位,而char不是

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