如何将字节从 char 数组转移到 int
How to shift bytes from char array into int
我想用 C 中的 char 数组创建一个 int 变量。
char 数组如下所示:
buffer[0] = 0xcf
buffer[1] = 0x04
buffer[2] = 0x00
buffer[3] = 0x00
移位看起来像这样
x = (buffer[1] << 8 )| (buffer[0] << 0) ;
之后 x 看起来像这样:
x = 0xffff04cf
现在一切都很好,如果前两个字节不是 ff。
如果我尝试这条线
x = (buffer[3] << 24 )| (buffer[2] << 16)| (buffer[1] << 8)| (buffer[0] << 0) ;
看起来还是
x = 0xffff04cf
即使我尝试在移入 04cf 之前或之后移入零,它看起来仍然是一样的。
这是正确的想法还是我做错了什么?
对于这样的任务,我喜欢使用联合,例如:
union tag_int_chars {
char buffer[sizeof(int32_t)];
int32_t value;
} int_chars;
int_chars.value = 0x01234567;
int_chars.buffer[0] = 0xff;
这将自动覆盖内存而无需转移。设置 int 的值,瞧,chars 已经改变,改变一个 char 值,瞧,int 已经改变。
该示例将在小端机器上保留 int 值 = 0x012345ff。
另一个简单的方法是使用 memcpy():
#include <string.h>
char buffer[sizeof(int32_t)];
int32_t value;
memcpy(&value, buffer, sizeof(int32_t)); // chars to int
memcpy(buffer, &value, sizeof(int32_t)); // int to chars
问题是您通过带符号的类型声明了 buffer
,可能是(带符号的)char。当应用运算符<<
时,会进行整型提升,由于0xcf
在8位有符号类型中代表负值(即-49
),所以会保持负值(但由更多位表示,即 0xffffffcf
)。请注意,-1
表示为 0xFFFFFFFF
,反之亦然。
要解决这个问题,只需将 buffer
定义为
unsigned char buffer[4]
如果不允许更改 buffer
的数据类型,您可以编写...
unsigned x = ( (unsigned char)buffer[0] << 8 )| ((unsigned char)buffer[1] << 4) ;
我想用 C 中的 char 数组创建一个 int 变量。
char 数组如下所示:
buffer[0] = 0xcf
buffer[1] = 0x04
buffer[2] = 0x00
buffer[3] = 0x00
移位看起来像这样
x = (buffer[1] << 8 )| (buffer[0] << 0) ;
之后 x 看起来像这样:
x = 0xffff04cf
现在一切都很好,如果前两个字节不是 ff。
如果我尝试这条线
x = (buffer[3] << 24 )| (buffer[2] << 16)| (buffer[1] << 8)| (buffer[0] << 0) ;
看起来还是
x = 0xffff04cf
即使我尝试在移入 04cf 之前或之后移入零,它看起来仍然是一样的。
这是正确的想法还是我做错了什么?
对于这样的任务,我喜欢使用联合,例如:
union tag_int_chars {
char buffer[sizeof(int32_t)];
int32_t value;
} int_chars;
int_chars.value = 0x01234567;
int_chars.buffer[0] = 0xff;
这将自动覆盖内存而无需转移。设置 int 的值,瞧,chars 已经改变,改变一个 char 值,瞧,int 已经改变。
该示例将在小端机器上保留 int 值 = 0x012345ff。
另一个简单的方法是使用 memcpy():
#include <string.h>
char buffer[sizeof(int32_t)];
int32_t value;
memcpy(&value, buffer, sizeof(int32_t)); // chars to int
memcpy(buffer, &value, sizeof(int32_t)); // int to chars
问题是您通过带符号的类型声明了 buffer
,可能是(带符号的)char。当应用运算符<<
时,会进行整型提升,由于0xcf
在8位有符号类型中代表负值(即-49
),所以会保持负值(但由更多位表示,即 0xffffffcf
)。请注意,-1
表示为 0xFFFFFFFF
,反之亦然。
要解决这个问题,只需将 buffer
定义为
unsigned char buffer[4]
如果不允许更改 buffer
的数据类型,您可以编写...
unsigned x = ( (unsigned char)buffer[0] << 8 )| ((unsigned char)buffer[1] << 4) ;