Qt|大小端数据转换(补充)

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

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

第一个方法:


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;
}

float直接报错 

第二个方法:

 

template <typename T>
QByteArray toData(T value, bool isLittle) {
    QByteArray data;
    QDataStream stream(&data, QIODevice::WriteOnly);
    if (isLittle)
        stream.setByteOrder(QDataStream::LittleEndian);
    else
        stream.setByteOrder(QDataStream::BigEndian);
    stream << value;
    return data;
}

测试float类型转换:

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

直接查看内存中f的值:

 

 

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

template <typename T>
bool fromData(const QByteArray &data, bool isLittle, T &value) {
  unsigned char *dataPtr = (unsigned char *)data.data();
  unsigned char *valuePtr = (unsigned char *)&value;
  for (int i = 0; i < sizeof(T); ++i) {
    if (isLittle)
      valuePtr[i] = dataPtr[i] & 0xff;
    else
      valuePtr[i] = dataPtr[sizeof(T) - i - 1] & 0xff;
  }
  return true;
}

template <typename T>
QByteArray toData(const T &value, bool isLittle) {
  QByteArray data;
  unsigned char *valuePtr = (unsigned char *)&value;
  for (int i = 0; i < sizeof(T); ++i) {
    if (isLittle)
      data.append(valuePtr[i]);
    else
      data.append(valuePtr[sizeof(T) - i - 1]);
  }
  return data;
}

 测试:

int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  float f = 3.14;
  QByteArray data = toData(f, true);
  qDebug() << data.toHex();
  float f1 = 0;
  fromData(data, true, f1);
  qDebug() << f1;
  return a.exec();
}

编译运行查看打印:

与内存中查看一致 

相关推荐

  1. Qt应用软件【数据篇】大小数据转换

    2024-02-21 17:34:01       54 阅读
  2. qt c++ 大小字节序数据获取与转换

    2024-02-21 17:34:01       27 阅读
  3. C++|char*大小转换

    2024-02-21 17:34:01       45 阅读
  4. qt数据类型转换

    2024-02-21 17:34:01       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-21 17:34:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-21 17:34:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-21 17:34:01       87 阅读
  4. Python语言-面向对象

    2024-02-21 17:34:01       96 阅读

热门阅读

  1. php 函数 三 公钥私钥

    2024-02-21 17:34:01       54 阅读
  2. 【ES】es查询term、match、match_phrase、mast_not、mast...

    2024-02-21 17:34:01       52 阅读
  3. Python自动化部署与配置管理:Ansible与Docker

    2024-02-21 17:34:01       52 阅读
  4. python3调用阿里云openapi脚本 - 生产环境

    2024-02-21 17:34:01       49 阅读
  5. 本地模拟发送、接收RabbitMQ数据

    2024-02-21 17:34:01       56 阅读
  6. 怎样重置ubuntu mysql8密码

    2024-02-21 17:34:01       52 阅读
  7. ARM体系架构

    2024-02-21 17:34:01       45 阅读
  8. 【python】使用OpenCV进行行人检测

    2024-02-21 17:34:01       57 阅读
  9. NebulaGraph学习笔记-自定义池连接

    2024-02-21 17:34:01       44 阅读
  10. vue学习笔记

    2024-02-21 17:34:01       52 阅读
  11. 为什么使用 Redis,不用 Memcache 和 MongoDB?

    2024-02-21 17:34:01       48 阅读