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

news/2024/10/6 16:07:49/

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把小端的数据序,变成了大端的数据序。

 


http://www.ppmy.cn/news/1473979.html

相关文章

项目收获总结--MyBatis的知识收获

一、概述 最近几天公司项目开发上线完成&#xff0c;做个收获总结吧~ 今天记录MyBatis的收获和提升。 二、获取自动生成的(主)键值 insert 方法总是返回一个 int 值 &#xff0c;这个值代表的是插入的行数。若表的主键id采用自增长策略&#xff0c;自动生成的键值在 insert…

怎么样才能为公司申请OV证书?

OV证书&#xff0c;全称为组织验证型SSL证书&#xff08;Organization Validation SSL Certificate&#xff09;&#xff0c;是一种高级别的SSL/TLS证书&#xff0c;用于加密网站通信并验证网站所属组织的合法身份。相比于基本的域名验证型证书&#xff08;DV证书&#xff09;&…

SQL跨数据库服务器查询和跨表批量插入的操作

MSSQL实现跨服务器查询数据库 EXEC sp_addlinkedserver server192.168.1.10, --链接服务器别名 srvproduct, providerSQLOLEDB, datasrc192.168.1.10 --要访问的的数据库所在的服务器的ip GO EXEC sp_addlinkedsrvlogin 192.168.1.10, --链接服务器别名…

【论文阅读】XuanYuan: An AI-Native Database

XuanYuan: An AI-Native Database 这篇文章主要是讨论了AI4DB 和 DB4AI 集成的数据库架构&#xff0c;以此提出了AI原生的数据库&#xff0c;架构如下&#xff1a; 而具体发展阶段来说&#xff0c;AI原生数据库主要由五个阶段组成 第一阶段&#xff0c;AI建议型数据库&#xf…

个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)

目录 一、效果展示 二、项目概述 三、手把手快速搭建实现本项目 3.1 前端实现 3.2 后端方向 五、后续开发计划 一、效果展示 默认展示 一般对话展示&#xff1a; 代码对话展示&#xff1a; 二、项目概述 本项目是一个基于Web的智能对话服务平台&#xff0c;通过后端与第…

Python 3.x 下的 3D 游戏引擎

在 Python 3.x 中&#xff0c;有几个比较流行的用于开发 3D 游戏的引擎和库。虽然 Python 自身不是一个主流的游戏开发语言&#xff0c;但是可以通过这些库和引擎结合其它语言或者底层渲染引擎来实现复杂的游戏开发。 1、问题背景 在 Linux 系统中&#xff0c;尤其是 Debian 7…

探索企业信用巅峰:3A企业认证的魅力与价值

在现代商业环境中&#xff0c;企业的信用和信誉是其发展的核心要素之一。3A企业认证作为信用评级的最高等级&#xff0c;正在吸引越来越多企业的关注。究竟什么是3A企业认证&#xff1f;它为什么对企业如此重要&#xff1f;本文将深入探讨3A企业认证的独特魅力和巨大价值。 3A企…

Spring事务的进阶。@Transactional的rollbackFor和propagation属性。

1.3 事务进阶 前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性&#xff1a; 异常回滚的属性&#xff1a;rollbackFor &…