C 如何将整数从字符缓冲区读入int变量
我是c语言编程新手,正在从事socket编程。我希望将值从char*缓冲区存储到不同的变量,但在存储int值时遇到了问题 我从套接字收到的数据是二进制的,并使用C 如何将整数从字符缓冲区读入int变量,c,C,我是c语言编程新手,正在从事socket编程。我希望将值从char*缓冲区存储到不同的变量,但在存储int值时遇到了问题 我从套接字收到的数据是二进制的,并使用recv()保存在char*缓冲区中。 缓冲区的前3个字节将保存在三个不同的unsigned char变量中,通过执行以下操作可以正常工作: unsigned char first = buffer[0]; unsigned char second= buffer[1]; unsigned char third = buffer[2];
recv()
保存在char*缓冲区中。
缓冲区的前3个字节将保存在三个不同的unsigned char
变量中,通过执行以下操作可以正常工作:
unsigned char first = buffer[0];
unsigned char second= buffer[1];
unsigned char third = buffer[2];
现在我的问题来了。我想将下一个字节保存在两个int变量中(每个变量4个字节)。现在我试过:
unsigned int fourth= buffer[3];
unsigned int fifth= buffer[7];
第四个变量包含数字83,这是预期值。
然而,第五个变量应该是数字1000,但我得到的是232。我在这里遗漏了什么?您有三种方法:
unsigned int fourth
unsigned int fifth;
如果持久性是相同的
或者你可以使用工会
更通用的方式(但您仍然需要知道数据是如何存储在缓冲区中的)
如果缓冲区首先存储最不重要的字节(小端):
fourth=缓冲区[3]+((无符号整数)缓冲区[4])
我错过了什么
您缺少unsigned int fourth=buffer[3];
将只读取所需4个字节中的1个。要获得正确的值,您需要读取并使用buffer[3]
,buffer[4]
,buffer[5],buffer[6]
。为了获得整数值,您需要应用适当的位移位并将内容相加
当通过网络交换数据时,数据(aka应始终)以“网络顺序”发送。主机可能使用不同的字节顺序。因此,首先将4个字节转换为“网络顺序”无符号32位整数,然后转换为主机顺序
uint32_t network_uint32 = ((unsigned int)buffer[3] << 24) +
((unsigned int)buffer[4] << 16) +
((unsigned int)buffer[5] << 8) +
(unsigned int)buffer[6];
uint32_t host_uint32 = ntohl(network_uint32);
uint32\u t网络uint32=((无符号整数)缓冲区[3]至少在你的问题中显示字符缓冲区的内容,你已经了解了多字节值吗?你需要根据二进制数据的尾数来计算整数。我猜这已经是了。但是当OP问他为什么得到232而不是1000时:unsigned int fifth=buffer[7];
意味着分配字符值(一个字节)从buffer[7]
到堆栈上的变量fifth
。由于十进制1000是十六进制的0x3E8,并且数据以这种方式存储,所以buffer[7]
中有0xE8(232十进制)和buffer[8]
中有0x3,buffer[9]
和buffer[10]
中有0x0。无符号int-fifth=buffer[7];
不从缓冲区[7..10]
中获取四个字节,它只获取缓冲区[7]
的值,并将其作为int存储到第五个
中。请参阅链接的问题以查看如何获取int值。“我正在使用套接字编程”那么所用协议的网络端和客户端的CPU端是什么?
fourth = buffer[3] + (((unsigned int)buffer[4]) << 8) + (((unsigned int)buffer[5]) << 16) + (((unsigned int)buffer[6]) << 24)
fourth = buffer[6] + (((unsigned int)buffer[5]) << 8) + (((unsigned int)buffer[4]) << 16) + (((unsigned int)buffer[3]) << 24)
uint32_t network_uint32 = ((unsigned int)buffer[3] << 24) +
((unsigned int)buffer[4] << 16) +
((unsigned int)buffer[5] << 8) +
(unsigned int)buffer[6];
uint32_t host_uint32 = ntohl(network_uint32);