RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1077756
Accepted
Роман Худобердин
Роман Худобердин
Asked:2020-02-03 20:21:36 +0000 UTC2020-02-03 20:21:36 +0000 UTC 2020-02-03 20:21:36 +0000 UTC

如何接受 UDP QByteArray 并将其解析为位字段的结构?

  • 772

有 2 个位域结构组合成一个结构。之前在结构整体大小允许的情况下,我在uint64中通过union进行了union。现在结构体的大小变大了,我把它从服务器传到客户端的QByteArray,现在接收和解析出现了问题。

正常人怎么做才对?你还可以举个例子,我会很高兴的!

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Юрий Козлов
    2020-02-03T20:31:48Z2020-02-03T20:31:48Z

    例如,这是我安排结构的方式:

    PACKED_START
    struct armos_header_t
    {
        unsigned short cmd          :14;
        unsigned short message_type :1;
        unsigned short need_ans     :1;
        unsigned short length       :16;
        unsigned short sender_id    :16;
        unsigned char  error        :8;
        unsigned char  version      :8;
        unsigned short receiver_id  :16;
        unsigned short counter      :16;
    };
    PACKED_END
    

    在哪里

    #  define PACKED_START _Pragma("pack(push, 1)")
    
    #  define PACKED_END _Pragma("pack(pop)")
    

    然后在通过网络接收的消息中,我找到结构数据开始的位置,并使用 memcpy 将等于其大小的字节数复制到结构中。

    • 3
  2. Best Answer
    Роман Худобердин
    2020-02-11T15:45:58Z2020-02-11T15:45:58Z

    首先,您需要将网络 API 连接到 .pro 项目文件,操作如下。

    QT += network
    

    并立即将库连接到项目

    #include <QUdpSocket>
    

    让我们从传输开始。在课堂上的某个地方,您正在创建一个新套接字。

    QUdpSocket *socket = new QUdpSocket();
    

    我们在要放置消息的类中创建一个结构。

    结构:

    #pragma pack(push, 1) // работает без директив
    struct srt_t // размер структуры 160 бит или 20 байт
    {
        uint8_t one;
        uint8_t two;
        uint16_t three;
        uint32_t four;
        uint64_t five;
        uint32_t six: 16,
                 seven: 16;
    };
    #pragma pack(pop)
    

    接下来,您将位域转换为 QByteArray,如下所示。

    srt_t ht{ 255, 255, 65535, 4294967295, 9223372036854775807, 65535, 65535 };
    
    QByteArray arr;
    arr.append( reinterpret_cast<char *>( &ht ), sizeof( ht ) );
    

    将bit域编码进去后,QByteArray就可以发送我们的消息了,在这个网站上可以看到更详细的例子,不过最好参考Qt官方文档。

    socket->writeDatagram( arr , QHostAddress("127.0.0.1"), 1234 );
    

    至此,您可以完成发送。让我们开始阅读我们的消息,为了让我们的程序接受我们的消息,我们需要QObject::connect用一个信号来创建它以进入数据缓冲区。

    从缓冲区读取和解码数据:

    QByteArray buffer;
    
    srt_t *ht = reinterpret_cast<srt_t *>(buffer.data());
    

    就是这样,数据被放入QByteArray并通过 发送udp,另一方面,它被接收并解码回位字段。

    • -1

相关问题

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5