加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中将一个int存储在char缓冲区中,然后检索它

发布时间:2020-12-16 03:17:16 所属栏目:百科 来源:网络整理
导读:我正在编写一个套接字客户端 – 服务器应用程序,其中服务器需要向客户端发送大型缓冲区,并且所有缓冲区都应该单独处理,因此我想将缓冲区长度放在缓冲区中,以便客户端可以读取数据长度从缓冲区和过程相应. 要放长长度值,我需要将一个整数值分成一个字节,并将
我正在编写一个套接字客户端 – 服务器应用程序,其中服务器需要向客户端发送大型缓冲区,并且所有缓冲区都应该单独处理,因此我想将缓冲区长度放在缓冲区中,以便客户端可以读取数据长度从缓冲区和过程相应.

要放长长度值,我需要将一个整数值分成一个字节,并将其存储在缓冲区中以通过套接字发送.我可以将整数分成四部分,但在加入时我无法检索正确的值.为了演示我的问题,我编写了一个示例程序,我将int分为四个字符变量,然后再加入另一个整数.目标是加入后我应该得到相同的结果.

这是我的小程序.

#include <stdio.h>

int main ()
{
    int inVal = 0,outVal =0;
    char buf[5] = {0};

    inVal = 67502978;

    printf ("inVal: %dn",inVal);

    buf[0] = inVal & 0xff;
    buf[1] = (inVal >> 8) & 0xff;
    buf[2] = (inVal >> 16) & 0xff;
    buf[3] = (inVal >> 24) & 0xff;

    outVal = buf[3];
    outVal = outVal << 8;
    outVal |= buf[2];
    outVal = outVal << 8;
    outVal |= buf[1];
    outVal = outVal << 8;
    outVal |= buf[0];

    printf ("outVal: %dn",outVal);
    return 0;
}

产量

inVal:67502978
outVal:-126

我究竟做错了什么?

解决方法

一个问题是您在签名号码上使用逐位运算符.这总是一个坏主意,几乎总是不正确的.请注意,char具有实现定义的签名,与始终签名的int不同.

因此,你应该用uint32_t和char替换为uint8_t.使用这种无符号类型,您可以消除在负数上使用位移的可能性,这将是一个错误.同样,如果您将数据移入签名号码的符号位,您将收到错误.

不用说,如果整数不是4个字节,代码将不起作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读