如何将字节从char数组转换为int

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将字节从char数组转换为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转换之前或之后尝试移入零,它看起来仍然是相同的。

这是正确的想法还是我做错了什么?

答案

问题是您通过签名类型(可能是(签名)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) ;
另一答案

对于像这样的任务,我喜欢使用工会,例如:

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

以上是关于如何将字节从char数组转换为int的主要内容,如果未能解决你的问题,请参考以下文章

如何将转换为 char 数组的 int 返回到 main 以显示它

从int数组转换为char数组

如何将char*转换为wchar

如何使用 atoi() 将 char 数组的元素转换为 int? [复制]

如何将char数组转换为字节数组?

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?