C 如何将整数从字符缓冲区读入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];

我是c语言编程新手,正在从事socket编程。我希望将值从char*缓冲区存储到不同的变量,但在存储int值时遇到了问题

我从套接字收到的数据是二进制的,并使用
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);