我想用C中的char数组创建一个int varibale。
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转换之前或之后尝试移入零,它看起来仍然是相同的。
这是它的最重要的想法还是我做错了什么?
答案 0 :(得分:3)
问题是您通过签名类型(可能是(已签名)char)声明buffer
。在应用运算符<<
时,将执行整数提升,并且由于8位有符号类型中的值0xcf
表示负值(即-49
),因此它将保持为负值(但由更多位表示,即0xffffffcf
)。请注意,-1
表示为0xFFFFFFFF
,反之亦然。
要解决此问题,只需将buffer
定义为
unsigned char buffer[4]
如果您不允许更改buffer
的数据类型,您可以写...
unsigned x = ( (unsigned char)buffer[0] << 8 )| ((unsigned char)buffer[1] << 4) ;
答案 1 :(得分:0)
对于像这样的任务,我喜欢使用工会,例如:
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