码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt|大小端数据转换(补充)


    Qt|大小端数据转换-CSDN博客

    之前这篇文章大小端数据转换如果是小数就会有问题。

    第一个方法:

    1. template <typename T>
    2. static QByteArray toData(const T &value, bool isLittle) {
    3. QByteArray data;
    4. for (int i = 0; i < sizeof(T); ++i) {
    5. int bitOffset = (isLittle) ? i : sizeof(T) - i - 1;
    6. data.append(value >> bitOffset * 8);
    7. }
    8. return data;
    9. }

    float直接报错 

    第二个方法:

     

    1. template <typename T>
    2. QByteArray toData(T value, bool isLittle) {
    3. QByteArray data;
    4. QDataStream stream(&data, QIODevice::WriteOnly);
    5. if (isLittle)
    6. stream.setByteOrder(QDataStream::LittleEndian);
    7. else
    8. stream.setByteOrder(QDataStream::BigEndian);
    9. stream << value;
    10. return data;
    11. }

    测试float类型转换:

    float类型占四个字节,打印的结果占有8个字节,明显是错误的。

    直接查看内存中f的值:

     

     

    f(3.14)在内存中为“c3f54840”,所以可以直接取地址进行转换,废话少说直接上代码:

    1. template <typename T>
    2. bool fromData(const QByteArray &data, bool isLittle, T &value) {
    3. unsigned char *dataPtr = (unsigned char *)data.data();
    4. unsigned char *valuePtr = (unsigned char *)&value;
    5. for (int i = 0; i < sizeof(T); ++i) {
    6. if (isLittle)
    7. valuePtr[i] = dataPtr[i] & 0xff;
    8. else
    9. valuePtr[i] = dataPtr[sizeof(T) - i - 1] & 0xff;
    10. }
    11. return true;
    12. }
    13. template <typename T>
    14. QByteArray toData(const T &value, bool isLittle) {
    15. QByteArray data;
    16. unsigned char *valuePtr = (unsigned char *)&value;
    17. for (int i = 0; i < sizeof(T); ++i) {
    18. if (isLittle)
    19. data.append(valuePtr[i]);
    20. else
    21. data.append(valuePtr[sizeof(T) - i - 1]);
    22. }
    23. return data;
    24. }

     测试:

    1. int main(int argc, char *argv[]) {
    2. QCoreApplication a(argc, argv);
    3. float f = 3.14;
    4. QByteArray data = toData(f, true);
    5. qDebug() << data.toHex();
    6. float f1 = 0;
    7. fromData(data, true, f1);
    8. qDebug() << f1;
    9. return a.exec();
    10. }

    编译运行查看打印:

    与内存中查看一致 

  • 相关阅读:
    2023.11.8 hadoop学习-概述,hdfs dfs的shell命令
    npm私服发包及使用
    【论文简述及翻译】Learning for Disparity Estimation through Feature Constancy(CVPR 2018)
    面试突击39:synchronized底层是如何实现的?
    Spring整合Junit(单元测试)
    单页面应用(SPA):改变用户体验的未来
    PPT密码解密,简单教程,保护幻灯片内容
    Java面向对象高级
    从李佳琦到背后的商业逻辑再到游戏行业
    代码随想录算法训练营第五十九天| LeetCode 647 回文子串、LeetCode 516 最长回文子序列、动态规划总结
  • 原文地址:https://blog.csdn.net/qq_41949352/article/details/136199445
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号