• 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. }

    编译运行查看打印:

    与内存中查看一致 

  • 相关阅读:
    [机缘参悟-32]:鬼谷子-抵巇[xī]篇-面对危险与问题的五种态度
    Flink部署——命令行界面
    FBA海运是什么,FBA海运的优势是什么
    Docker的网络模式 (4+1)
    【学Python】环境搭建,遇环境变量问题
    【C++】STL01-基本使用
    C# Winfrom 常用功能整合-2
    002 IOC和DI使用
    UE集成第三方库开发技巧、自定义第三方库输出路径
    软件设计模式(五):代理模式
  • 原文地址:https://blog.csdn.net/qq_41949352/article/details/136199445