当前位置: 首页> 财经> 股票 > qt 关于大端小端的一个实验 简单实验

qt 关于大端小端的一个实验 简单实验

时间:2025/8/23 8:41:52来源:https://blog.csdn.net/xie__jin__cheng/article/details/140207028 浏览次数:0次

1.概要

起因我用滚动是x86电脑,我用一个usort  a11a ,我期待转换长的char字符应该是这样的“1aa1”,因为x86是小端的,这也是这个16位 类型的实际内存顺序,但是输出的结果是 “a11a”,难道这环境不是小端?难道qt能智能转换?。但结果是QDataStream默认安装大端保存数据。他再小端的环境这样保存数据。我的代码如下

QDataStream out(&block, QIODevice::WriteOnly);
    out<<b;

我还百度上确认这给结果,但结果是否定的,但现象确和我的推论一样。

1.问题呢1:QDataStream 具有自动修正为大端格式的能力吗?

QDataStream 是 Qt 框架中的一个类,用于序列化和反序列化 Qt 数据类型。关于 QDataStream 是否具有自动修正为大端格式的能力,实际上它并不直接“修正”数据的字节序为大端或小端。相反,QDataStream 在序列化和反序列化数据时,会以一种可移植的方式处理数据,以确保在不同的平台上能够一致地读写数据。

QDataStream 在写入数据时,会以一种特定的格式保存数据,这个格式是 Qt 特定的,并不直接对应大端或小端。当在不同平台上读取这些数据时,QDataStream 会根据当前平台的特性(如字节序)来正确解析这些数据。这意味着,无论数据是在大端还是小端机器上生成的,只要使用 QDataStream 进行读取,它都能够正确地还原原始数据。

这种能力并不是通过“修正”字节序来实现的,而是通过一种与平台无关的数据表示方式来实现的。因此,QDataStream 并不直接修改数据的字节序,而是以一种可移植的方式处理数据,以确保数据的一致性和可移植性。

总的来说,虽然 QDataStream 不直接“修正”为大端格式,但它确实提供了一种在不同平台上一致地读写数据的方法。

2.问题2:QDataStream 保存的字节数据都是按照大端保存的吗

QDataStream 保存的字节数据并不总是按照大端(Big-Endian)方式保存。以下是关于 QDataStream 保存字节数据方式的详细解释:

  1. 字节序的灵活性
    QDataStream 在处理多字节数据(大于一个字节的数据)时,确实涉及字节序的问题。字节序,即多字节数据在内存中的存储顺序,有两种方式:Big-Endian(大端)和 Little-Endian(小端)。在 Big-Endian 中,高位字节存储在低地址端,而 Little-Endian 则相反,低位字节存储在低地址端。

  2. QDataStream 的默认行为
    虽然 Big-Endian 是网络传输和文件存储中常见的字节序,但 QDataStream 的设计考虑到了跨平台的兼容性。它并不总是默认按照 Big-Endian 保存数据。实际上,QDataStream 的行为可能受到其设置或 Qt 版本的影响。

  3. 序列化和反序列化
    QDataStream 主要用于对象的序列化和反序列化。序列化是将对象状态转换为可保存或可传输的形式,而反序列化则是相反的过程。在这个过程中,QDataStream 会以一种可移植的方式处理数据,以确保数据在不同的平台和架构上能够一致地读写。

  4. 平台无关性
    重要的是要理解,QDataStream 的目标是提供一种与平台无关的数据读写机制。这意味着,无论数据是在大端机器还是小端机器上生成的,QDataStream 都应该能够正确地读写这些数据。它不是通过强制使用 Big-Endian 或 Little-Endian 来实现这一点,而是通过其内部的数据表示和处理机制来确保数据的一致性和可移植性。

综上所述,不能简单地认为 QDataStream 保存的字节数据都是按照大端保存的。它的设计目标是提供一种跨平台的数据读写解决方案,而不是固定于某一种字节序。在实际应用中,如果需要特定的字节序处理,可能需要在读写数据前进行显式的转换或设置。

2.代码 

#include <QCoreApplication>
#include <QDebug>
#include <QByteArray>
#include <QIODevice>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QByteArray block;unsigned short b = 1;char c[2];std::memcpy(c, &b, 2);for(int i=0;i<sizeof(b);i++){int d = c[i];qDebug()<<i<<":"<<d;//cout<<i<<":"<<d;}QDataStream out(&block, QIODevice::WriteOnly);out<<b;char* chars = block.data();for(int i=0;i<block.length();i++){int d = chars[i];//char d = 5;qDebug()<<i<<":"<<d;//cout<<i<<":"<<d;}qDebug()<<"hello 大小端实验";return a.exec();
}

3.运行结果

0 : 1
1 : 0
0 : 0
1 : 1
hello ��С��ʵ��

4.结果 

 我直接输出的内存顺序和QDataStream处理过的顺序完全不同,也就是说,QDataStream把小端的数据序,变成了大端的数据序。

 

关键字:qt 关于大端小端的一个实验 简单实验

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: