当前位置: 代码网 > it编程>编程语言>C/C++ > 利用Qt实现网络数据报文大小端数据的收发

利用Qt实现网络数据报文大小端数据的收发

2024年11月29日 C/C++ 我要评论
1.大小端数据简介大小端(endianness)是计算机体系结构的一个术语,它描述了多字节数据在内存中的存储顺序。以下是大小端的定义和它们的特点:大端(big-endian)在大端模式中,一个字的最高

1.大小端数据简介

大小端(endianness)是计算机体系结构的一个术语,它描述了多字节数据在内存中的存储顺序。以下是大小端的定义和它们的特点:

大端(big-endian)

在大端模式中,一个字的最高有效字节(msb,即最左边的那位)存储在最低的内存地址处,而最低有效字节(lsb,即最右边的那位)存储在最高的内存地址处。

例如,假设有一个16位的数字 0x1234,其在内存中的存储顺序如下:

地址增加方向 -->

[ 12 ] [ 34 ]

其中 [12] 是高字节,存储在低地址处;[34] 是低字节,存储在高地址处。

小端(little-endian)

在小端模式中,情况正好相反:一个字的最低有效字节存储在最低的内存地址处,而最高有效字节存储在最高的内存地址处。

继续上面的例子,16位的数字 0x1234 在小端模式下的存储顺序如下:

地址增加方向 -->

[ 34 ] [ 12 ]

其中 [34] 是低字节,存储在低地址处;[12] 是高字节,存储在高地址处。

2.小端数据收发

假设我们现在有一个udp头的数据结构如下所示。

    //udp协议头
    typedef struct
    {
        quint16 type;               //报文类型
        quint16 num;                //报文序号,取值范围为0~65535
        quint32 len;                //报文长度
        quint16 srcaddr;            //信源地址
        quint16 dstaddr;            //信宿地址
        quint8  year;               //发送时间  年份后两位   utc时间
        quint8  month;
        quint8  day;
        quint8  hour;
        quint8  minute;
        quint8  second;
    }udpheader;

数据发送:组包。

qbytearray pack(const protocol::udpheader &header)
{
    qbytearray byte;
    byte.append((char*)&(header.type),2);
    byte.append((char*)&(header.num),2);
    byte.append((char*)&(header.len),4);
    byte.append((char*)&(header.srcaddr),2);
    byte.append((char*)&(header.dstaddr),2);

    qstring format = "yy-mm-dd-hh-mm-ss";
    qdatetime datetime = qdatetime::currentdatetime();
    datetime.settimespec(qt::localtime);

    qdatetime utctime = datetime.toutc();

    qstring strutctime = utctime.tostring(format);

    qstringlist timelist = strutctime.split('-');

    quint8 year = timelist.at(0).toint();
    quint8 month = timelist.at(1).toint();
    quint8 day = timelist.at(2).toint();
    quint8 hour = timelist.at(3).toint();
    quint8 minute = timelist.at(4).toint();
    quint8 sec = timelist.at(5).toint();

    byte.append(year);
    byte.append(month);
    byte.append(day);
    byte.append(hour);
    byte.append(minute);
    byte.append(sec);

    return byte;
}

数据接收:拆包

void unpack(const qbytearray &byte, protocol::udpheader &header)
{
    if(byte.size() != udp_header_len)
    {
        return;
    }

    memcpy(&header,byte.data(),sizeof(protocol::udpheader));
}

3.大端数据收发

还是上面的头例子。

数据发送:组包

使用qdatastream类作为辅助,设置setbyteorder为大端序列。

qbytearray packbigendian(const protocol::udpheader &header)
{
    qbytearray byte;
    qdatastream stream(&byte,qiodevice::writeonly);
    stream.setbyteorder(qdatastream::bigendian);

    stream<<(header.type);
    stream<<(header.num);
    stream<<(header.len);
    stream<<(header.srcaddr);
    stream<<(header.dstaddr);

    qstring format = "yy-mm-dd-hh-mm-ss";
    qdatetime datetime = qdatetime::currentdatetime();
    datetime.settimespec(qt::localtime);

    qdatetime utctime = datetime.toutc();

    qstring strutctime = utctime.tostring(format);

    qstringlist timelist = strutctime.split('-');

    quint8 year = timelist.at(0).toint();
    quint8 month = timelist.at(1).toint();
    quint8 day = timelist.at(2).toint();
    quint8 hour = timelist.at(3).toint();
    quint8 minute = timelist.at(4).toint();
    quint8 sec = timelist.at(5).toint();

    stream<<year;
    stream<<month;
    stream<<day;
    stream<<hour;
    stream<<minute;
    stream<<sec;

    return byte;
}

数据接收:拆包

对于多字节的数据,都需要单独使用qtobigendian转换为大端。

void unpackbigendian(const qbytearray &byte, protocol::udpheader &header)
{
    if(byte.size() != udp_header_len)
    {
        return;
    }

    memcpy(&header,byte.data(),sizeof(protocol::udpheader));
    header.type = qtobigendian(header.type);
    header.num= qtobigendian(header.num);
    header.len= qtobigendian(header.len);
    header.srcaddr= qtobigendian(header.srcaddr);
    header.dstaddr= qtobigendian(header.dstaddr);
}

到此这篇关于利用qt实现网络数据报文大小端数据的收发的文章就介绍到这了,更多相关qt大小端数据收发内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com