如何从 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);
移位和按位运算在所有处理器中通常都非常快。
建议:int、long可能大小不同。为确保 32 位大小,请使用 uint32_t 代替。
我有一个 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);
移位和按位运算在所有处理器中通常都非常快。
建议:int、long可能大小不同。为确保 32 位大小,请使用 uint32_t 代替。