Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字符数组中的字节转换为int_C_Arrays_Int_Shift - Fatal编程技术网

C 如何将字符数组中的字节转换为int

C 如何将字符数组中的字节转换为int,c,arrays,int,shift,C,Arrays,Int,Shift,我想用C中的字符数组制作一个int变量 char数组如下所示: buffer[0] = 0xcf buffer[1] = 0x04 buffer[2] = 0x00 buffer[3] = 0x00 x = 0xffff04cf 这种变化是这样的 x = (buffer[1] << 8 )| (buffer[0] << 0) ; 现在,如果前两个字节不是ff,一切都会好起来 如果我试试这句话 x = (buffer[3] << 24 )| (buffer

我想用C中的字符数组制作一个int变量

char数组如下所示:

buffer[0] = 0xcf
buffer[1] = 0x04
buffer[2] = 0x00
buffer[3] = 0x00
x = 0xffff04cf
这种变化是这样的

x = (buffer[1] << 8 )| (buffer[0] << 0) ;
现在,如果前两个字节不是ff,一切都会好起来

如果我试试这句话

x = (buffer[3] << 24 )| (buffer[2] << 16)| (buffer[1] << 8)| (buffer[0] << 0) ;
即使我尝试在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的值,瞧,字符已经改变了,改变一个字符值,瞧,int已经改变了

该示例将在一台小型endian机器上保留int值=0x012345ff

另一种简单的方法是使用memcpy():

#包括
字符缓冲区[sizeof(int32_t)];
int32_t值;
memcpy(&value,buffer,sizeof(int32_t));//字符到整数
memcpy(缓冲区和值,sizeof(int32_t));//整数到字符

对于此类任务,我喜欢使用联合,例如:

union tag_int_chars {
    char buffer[sizeof(int32_t)];
    int32_t value;
} int_chars;

int_chars.value = 0x01234567;

int_chars.buffer[0] = 0xff;
这将自动化内存覆盖,而无需移动。设置int的值,瞧,字符已经改变了,改变一个字符值,瞧,int已经改变了

该示例将在一台小型endian机器上保留int值=0x012345ff

另一种简单的方法是使用memcpy():

#包括
字符缓冲区[sizeof(int32_t)];
int32_t值;
memcpy(&value,buffer,sizeof(int32_t));//字符到整数
memcpy(缓冲区和值,sizeof(int32_t));//整数到字符


问题在于,您通过签名类型(可能是(签名)字符)声明了
缓冲区。应用运算符
时,问题是您通过有符号类型(可能是(有符号)字符)声明了
缓冲区。当应用操作符
时,很确定你的意思是
我不会得到一个无符号int。缓冲区来自插座的recv功能。您是将
缓冲区[0]
移位8,还是将
缓冲区[1]
移位4?此外,这不会导致值
0xffffcf04
,而是导致
0xffffcf40
。更改了它。像往常一样,第一次打错了,发个帖子。否则人们需要猜测你的实际类型。根据经验,1)使用无符号类型进行位运算,2)使用有符号类型进行算术运算。你肯定是说
我不会得到无符号整数。缓冲区来自插座的recv功能。您是将
缓冲区[0]
移位8,还是将
缓冲区[1]
移位4?此外,这不会导致值
0xffffcf04
,而是导致
0xffffcf40
。更改了它。像往常一样,第一次打错了,发个帖子。否则人们需要猜测你的实际类型。根据经验,1)使用无符号类型进行位运算,2)使用有符号类型进行算术运算。如果他们真的希望字节按他们显示的顺序排列,这是行不通的。此外,持久性可能是一个问题。否则它会起作用,我假设他们想通过文本描述来实现这一点,但代码确实提出了其他建议。同意,用户必须知道endianness才能工作。不知怎的,它工作了,但我不明白为什么。难道没有更简单的解决办法吗?将4字节字符数组转换为int应该是一项日常任务,因此解决方案应该是“每天”;)这是因为联合中的所有字段都与同一内存地址对齐,联合大小为最大字段。在这种情况下,int和四个字符在内存中共享相同的四个字节。这只是一种方法,另一个简单的方法是使用memcpy,编辑答案来包含这个。如果他们真的想要按他们显示的顺序排列字节,这是行不通的。此外,持久性可能是一个问题。否则它会起作用,我假设他们想通过文本描述来实现这一点,但代码确实提出了其他建议。同意,用户必须知道endianness才能工作。不知怎的,它工作了,但我不明白为什么。难道没有更简单的解决办法吗?将4字节字符数组转换为int应该是一项日常任务,因此解决方案应该是“每天”;)这是因为联合中的所有字段都与同一内存地址对齐,联合大小为最大字段。在这种情况下,int和四个字符在内存中共享相同的四个字节。这只是一种方法,另一种简单的方法是使用memcpy,编辑答案以包含此内容。缓冲区由winsockets的recv函数填充,该函数需要一个字符*。你的建议可以,但编译器不喜欢。错误C2664:“recv”:无法将参数2从“unsigned char[512]”转换为“char*”。您是否尝试了
(unsigned char)buffer[0]
-操作(未将
buffer
重新声明为
unsigned char buffer[4]
?它使用了以下行:x=(unsigned char)(recvbuf[3]缓冲区中填充了winsockets的recv函数,该函数需要一个字符*。您的建议可以,但编译器不喜欢。错误C2664:“recv”:无法将参数2从“unsigned char[512]”转换为“char*”。您是否尝试过
(unsigned char)缓冲区[0]
-这件事(没有将
缓冲区重新定义为
无符号字符缓冲区[4]
?它使用以下行:x=(无符号字符)(recvbuf[3]
#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
unsigned char buffer[4]
unsigned x = ( (unsigned char)buffer[0] << 8 )| ((unsigned char)buffer[1] << 4) ;