如何从 char 缓冲区创建 long int?

How can I create a long int from a char buffer?

我有一个 char 缓冲区 有 4 个二进制数:

buffer[0] = 00000000
buffer[1] = 00000000
buffer[2] = 00000000
buffer[3] = 00000001

我想 "fetch" 缓冲区的 4 个字节并创建一个 long int

在这种情况下,long int 变量将是:

test == 00000000 00000000 00000000 00000001

这是我的代码,但我觉得它在概念上是错误的:

int main() {
         unsigned char buffer [4];
         buffer[0] = 0;
         buffer[1] = 0;
         buffer[2] = 0;
         buffer[3] = 1;
         for (int i = 0; i < 4; i++)
                 printf ("%d\n", buffer[i]);

         long int * addr = (long int *) &buffer[0];
         long int test = * addr;
         printf ("test = %li\n", test);
}

输出:

0
0
0
1
test = 140728915197952

我尝试使用指针,因为我认为这是正确的方式,但我自己完全不理解。

我的机器是LittleEndian如果有帮助的话。

代码可以是:

#include <inttypes.h>
// ...

uint32_t test = buffer[0] * 0x1000000u + buffer[1] * 0x10000u + buffer[2] * 0x100u + buffer[3];
printf("test = " PRIu32 "\n", test);

在这种情况下使用固定宽度的字体是个好主意,因为 unsigned long 在不同的平台上可能有不同的尺寸。

您可以在循环中使用左移按位或,如下所示:

uint32_t l = 0;
for(int i=0;i<4;i++){
    l<<=8;
    l|=buffer[i];
}
printf("l=%x\n",l);

移位和按位运算在所有处理器中通常都非常快。

建议:intlong可能大小不同。为确保 32 位大小,请使用 uint32_t 代替。