当前位置: 首页 > news >正文

肥西县重点工程建设管理局网站wordpress界面菜单怎么弄

肥西县重点工程建设管理局网站,wordpress界面菜单怎么弄,建筑八大员证有哪些,鹤壁市城乡一体化示范区邮编后面打算写Qt关于网络编程的博客#xff0c;网络编程就绕不开字节流数据传输#xff0c;字节流数据的传输一般是根据协议来定义对应的报文该如何组包#xff0c;那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料#xff1a;大小端模…后面打算写Qt关于网络编程的博客网络编程就绕不开字节流数据传输字节流数据的传输一般是根据协议来定义对应的报文该如何组包那这就必然牵扯到了大端字节序和小端字节序的问题了。不清楚的大小端的可以看一下相关资料大小端模式_百度百科 (baidu.com)。 这里看一个具体的例子比如某个报文协议是这样定的 报头...设备编号U16(两个字节)设备温度U16(两个字节)设备湿度U16(两个字节)设备状态U16(两个字节)报尾... 那么传输过程的报文结构除去头尾之外应该是这样的 代码报文结构体这样定义 struct DeviceData {quint16 number;quint16 temperature;quint16 humidness;quint16 status; }; 然后简单测试一下 QByteArray data;DeviceData d;d.number 0x1234;d.temperature 0x5678;d.humidness 0x4321;d.status 0x8756;data.append(reinterpret_castchar *(d), sizeof(DeviceData));qDebug() data.toHex(); 编译运行查看一下打印结果 如果看了前面关于大小端的资料应该就会明白为什么这里打印结果是“3412785621435687”这里也有一个参考的文章大小端格式由编译器操作系统还是CPU决定的答案是CPU_大端cpu采用小端编译链-CSDN博客我的机器cpu如果不采取任何处理这里输出的确实是小端数据如果是大端那么就会输出对应的“1234567843218756”。如果上文中举例的协议定的就是小端数据传输那么就是这样写无需做任何处理。如果是大端数据传输则需要做对应的处理。同样上文中还存在一个问题比如设备编号协议里面定的是无符号一个字节即uint8类型的。那么结构体将会这样定义 struct DeviceData {quint8 number;quint16 temperature;quint16 humidness;quint16 status; }; 测试代码 QByteArray data;DeviceData d;d.number 0x12;d.temperature 0x5678;d.humidness 0x4321;d.status 0x8756;data.append(reinterpret_castchar *(d), sizeof(DeviceData));qDebug() data.toHex(); 这里将结构体转QByteArray使用了reinterpret_cast,可以自己查一下static_cast、dymatic_cast、reinterpret_cast以及Qt的qobject_cast有什么区别。同样还可以使用QByteArray的setRawData方法 QByteArray data; data.setRawData(reinterpret_castchar *(d), sizeof(DeviceData)); 结果也是一样的。 将对应QByteArray转回结构体直接使用memcpy即可。例如上面的例子: DeviceData dd; memcpy(dd, data.constData(), sizeof(DeviceData)); 打印输出 为什么打印是这样可以先看看这个结构体的大小打印 sizeof(DeviceData)可以看到是8个字节结构体成员一个quint8,三个quint16大小1222为什么是8而不是7 这个就需要了解关于字节对齐的知识了字节对齐_百度百科 (baidu.com) 直接采用1字节对齐 #pragma pack(push, 1); struct DeviceData {quint8 number;quint16 temperature;quint16 humidness;quint16 status; }; #pragma pack(pop); 再查看打印 然后sizeof(DeviceData)也是7了这里使用1字节对齐会影响效率。· 回到关于大小端的问题代码里面采用的是结构体转QByteArray这样就牵扯到了依靠系统自己的大小端来处理了代码不灵活。可以写一个通用的方法来根据需求转换对应需要的字节序。 方法一 思路是一个字节一个字节进行拷贝使用QByteArray的append方法以及位移操作。 比如一个无符号四字节的quint32 u320x12345678大端就是12345678小端就是78563412,先执行下列代码 quint32 u32 0x12345678;QByteArray data;data.append(u32);qDebug() data.toHex(); 查看打印 也就是说QByteArray的 append方法在这种情况下并不会将整数 u32 转换为字节流而是将整数的低字节最低有效字节追加到 QByteArray中。 转化为小端数据 原生数据操作原生数据QByteArray进行append追加12345678右移0位123456787812345678右移8位00123456785600123456右移16位0000123478563400001234右移24位0000001278563412 转化为大端数据 原生数据操作原生数据QByteArray进行append追加12345678右移24位000000121212345678右移16位00001234123400123456右移8位0012345612345600001234右移0位1234567812345678 对应代码 quint32 u32 0x12345678;//输出小端数据QByteArray littleEndian;littleEndian.append(u32);littleEndian.append(u32 8);littleEndian.append(u32 16);littleEndian.append(u32 24);qDebug() little: littleEndian.toHex();//输出大端数据QByteArray bigEndian;bigEndian.append(u32 24);bigEndian.append(u32 16);bigEndian.append(u32 8);bigEndian.append(u32);qDebug() bigEndian: bigEndian.toHex(); 编译运行查看打印 对应转回同理下面是完整代码 quint32 u32 0x12345678;//输出小端数据QByteArray littleEndian;littleEndian.append(u32);littleEndian.append(u32 8);littleEndian.append(u32 16);littleEndian.append(u32 24);qDebug() littleEndian: littleEndian.toHex();quint32 u32x 0;u32x | static_castquint8(littleEndian[0]);u32x | (static_castquint8(littleEndian[1]) 8);u32x | (static_castquint8(littleEndian[2]) 16);u32x | (static_castquint8(littleEndian[3]) 24);qDebug() ori data: u32x;//输出大端数据QByteArray bigEndian;bigEndian.append(u32 24);bigEndian.append(u32 16);bigEndian.append(u32 8);bigEndian.append(u32);qDebug() bigEndian: bigEndian.toHex();quint32 u32y 0;u32y | (static_castquint8(bigEndian[0]) 24);u32y | (static_castquint8(bigEndian[1]) 16);u32y | (static_castquint8(bigEndian[2]) 8);u32y | static_castquint8(bigEndian[3]);qDebug() ori data: u32y; 编译运行查看打印 305419896对应的16进制就是0x12345678 其他数据类型同理这里写成模板函数 template typename T static QByteArray toData(const T value, bool isLittle) {QByteArray data;for (int i 0; i sizeof(T); i) {int bitOffset (isLittle) ? i : sizeof(T) - i - 1;data.append(value bitOffset * 8);}return data; }template typename T static void fromData(const QByteArray data, bool isLittle, T value) {for (int i 0; i sizeof(T); i) {int bitOffset (isLittle) ? i : sizeof(T) - i - 1;value | (static_castquint8(data[i]) bitOffset * 8);} } 上面例子代码改为 quint32 u32 0x12345678;//输出小端数据QByteArray littleEndian toData(u32, true);qDebug() littleEndian: littleEndian.toHex();quint32 u32x 0;fromData(littleEndian, true, u32x);qDebug() ori data: u32x;//输出大端数据QByteArray bigEndian toData(u32, false);qDebug() bigEndian: bigEndian.toHex();quint32 u32y 0;fromData(bigEndian, false, u32y);qDebug() ori data: u32y; 编译运行查看打印 跟前面的一致。 方法二 思路是使用QDataStream的读写数据然后借助QDataStream的setByteOrder方法具体就不多细讲直接看模板函数 template typename T QByteArray toData1(T value, bool isLittle) {QByteArray data;QDataStream stream(data, QIODevice::WriteOnly);if (isLittle)stream.setByteOrder(QDataStream::LittleEndian);elsestream.setByteOrder(QDataStream::BigEndian);stream value;return data; }template typename T void fromData1(const QByteArray data, bool isLittle, T value) {QDataStream stream(data);if (isLittle)stream.setByteOrder(QDataStream::LittleEndian);elsestream.setByteOrder(QDataStream::BigEndian);stream value; } 将上面例子改为使用这两个方法 quint32 u32 0x12345678;//输出小端数据QByteArray littleEndian toData1(u32, true);qDebug() littleEndian: littleEndian.toHex();quint32 u32x 0;fromData1(littleEndian, true, u32x);qDebug() ori data: u32x;//输出大端数据QByteArray bigEndian toData1(u32, false);qDebug() bigEndian: bigEndian.toHex();quint32 u32y 0;fromData1(bigEndian, false, u32y);qDebug() ori data: u32y; 编译运行查看打印 与方法一结果一致。 方法三 借助Qt的QtEndian 首先qt有判断当前CPU是大端还是小端的宏 例如 #if Q_BYTE_ORDER Q_BIG_ENDIANqDebug() current endian is big; #endif#if Q_BYTE_ORDER Q_LITTLE_ENDIANqDebug() current endian is little; #endif 编译运行查看打印 因为我的是x86是小端。 对应Qt也有一些大小端转换的方法 具体使用有兴趣的可以探究一下我没有过多研究Qt的这个。
http://www.w-s-a.com/news/516509/

相关文章:

  • 宁夏网站开发设计说明书wordpress主题背景图片
  • 同一个阿里云可以做两个网站吗织梦 帝国 学校网站
  • 城阳网站建设培训网站后台怎么上传文件
  • 重庆茂尔建设集团有限公司网站网页制作教程软件
  • 金湖建设工程质量监督网站高端网站建设公司哪里济南兴田德润实惠吗
  • 站酷设计网站官网入口文字设计seo网站推广工具
  • 专业移动网站建设网站建设软件dw
  • 摄影网站设计思想视觉传达毕业设计作品网站
  • 需要优化的网站有哪些设计装修app
  • 数据型网站建设东莞好的网站国外站建设价格
  • 网络营销方法有哪些举例seo应用领域有哪些
  • 建设银行官方网站官网做网站的专业叫什么
  • 矿区网站建设濮阳做网站的公司有哪些
  • 有什么网站可以自己做书甘肃建设厅网站首页
  • 门户网站建设哪专业怎么把自己做的网站登录到网上
  • 如何做网站小编餐饮业手机php网站
  • 备案 网站商城网站设计公司排名
  • 汕头做网站优化公司seo软件简单易排名稳定
  • 如何做众筹网站微网站设计平台
  • 富平做网站十堰优化seo
  • 免费网站空间可访问wordpress弹窗注册代码
  • 东莞网站建设教程南京做代账会计在哪个网站上找
  • 网站开发好了 怎么发布wordpress数据库缓存插件
  • 工业电商网站怎么配色社交网站建设平台
  • 使用pycharm网站开发建一个网站需要什么条件
  • 网站建设哪些是需要外援的问题wordpress商品展示主题
  • 定制网站开发的目的是什么wordpress 增加按钮
  • 建设单位网站经费请示wordpress模板添加授权
  • 国外的电商网站有哪些为进一步加强校园网站建设
  • 专业集团门户网站建设企业微信商城和网站建设