大端小端及其转换

这篇具有很好参考价值的文章主要介绍了大端小端及其转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机在存储数据的时候,是以字节(byte)为基本单位来存储的,因此存储单字节类型的数据(比如char)不存在字节序的问题。但存储多字节的数据的时候(比方说4字节的int变量),就涉及到了以一个什么样的顺序来存储。下面举例来说明大端和小端的存储方式。

定义变量 unsigned long long a=0x1122334455667788 

变量a是一个64位的无符号整数,共需要8个字节来存储,那么在两种模式下是如何存储的呢?

||--1--||--2--||--3--||--4--||--5--||--6--||--7--||--8--||  地址

||  11 ||  22 ||  33 ||  44 ||  55 ||  66 ||  77 ||  88 ||  大端模式
||  88 ||  77 ||  66 ||  55 ||  44 ||  33 ||  22 ||  11 ||  小端模式
从中很容易可以看出各自的存储特点。
大端:高地址存低字节,低地址存高字节
小端:低地址存低字节,高地址存高字节
小端模式:强制类型转换数据不需要调整字节内容。
大端模式:符号位判断固定为第一个字节,容易判断正负,便于人类阅读。

判断大小端

#include <QCoreApplication>
#include <QDebug>

bool isLittleEndian(){
    unsigned short a = 0x1218;

    if( (*(char*)&a)  == 0x18){
        return true;
    }else{
        return false;
    }
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    if(isLittleEndian()){
        qDebug() << "LitteEndian";
    }else{
        qDebug() << "BigEndian";
    }

    return a.exec();
}

大小端转换

typedef unsigned short int uint16;
typedef unsigned long int uint32;
 
 
#define BigLittleSwap16(A)        ((((uint16)(A) & 0xff00) >> 8) | \
                                                       (((uint16)(A) & 0x00ff) << 8))
 
 
#define BigLittleSwap32(A)        ((((uint32)(A) & 0xff000000) >> 24) | \
                                                       (((uint32)(A) & 0x00ff0000) >> 8) | \
                                                       (((uint32)(A) & 0x0000ff00) << 8) | \
                                                       (((uint32)(A) & 0x000000ff) << 24))

Qt中大端小端的转换

Qt中<QtEndian>包含了大端小端转换的几个函数

T    qFromBigEndian(const uchar * src)
T    qFromBigEndian(T src)
T    qFromLittleEndian(const uchar * src)
T    qFromLittleEndian(T src)
void    qToBigEndian(T src, uchar * dest)
T    qToBigEndian(T src)
void    qToLittleEndian(T src, uchar * dest)
T    qToLittleEndian(T src)


下面对这个几个函数进行简单的说明。
   

 union{
        int a;
        char b[4];
    }test1,test2;
    test1.a=0x61626364;
    test2.a=qFromBigEndian(test1.a);
    qDebug()<<test1.b[0]<<test1.b[1]<<test1.b[2]<<test1.b[3];
    qDebug()<<test2.b[0]<<test2.b[1]<<test2.b[2]<<test2.b[3];


对于qFromBigEndian()函数,它会判断执行程序的主机的字节序,如果是大端模式的计算机,那么只是读取数据,不进行转换,如果是小端模式的计算机,那么则进行转换。
因此我在本机(小端模式)上的的执行结果是:

d c b a

a b c d

可以看出,它将数据进行了转换。
对于qFromLittleEndian()函数,和前者类似。对于大端模式的计算机进行转换,对于小端模式的计算机只是读取数据。

   

 union{
        int a;
        char b[4];
    }test1,test2;
    test1.a=0x61626364;
    test2.a=qFromLittleEndian(test1.a);
    qToBigEndian(test1.a,(uchar*)test2.b);
    qDebug()<<test1.b[0]<<test1.b[1]<<test1.b[2]<<test1.b[3];
    qDebug()<<test2.b[0]<<test2.b[1]<<test2.b[2]<<test2.b[3];


对于qToBigEndian()函数,也有着上面的规则,对于小端模式的计算机进行转换,对于大端模式的计算机只进行读取。
因此,本机(小端模式)的执行结果是:

d c b a

a b c d

对于qToLittleEndian()函数,只对大端模式的计算机进行转换。

需要注意的是,Qt中的模板T只针对有符号和无符号的整型,对于浮点型(一般也不会用到),需要进行强制类型转换。
 文章来源地址https://www.toymoban.com/news/detail-425077.html

到了这里,关于大端小端及其转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉 | 图像分类】图像分类常用数据集及其介绍(二)

    Oxford 102 Flower 是一个由 102 个花卉类别组成的图像分类数据集。 这些花被选为英国常见的花。 每个类别由 40 到 258 张图像组成。 这些图像具有较大的比例、姿势和光线变化。 此外,还存在类别内差异较大的类别以及几个非常相似的类别。 Tiny ImageNet 包含 200 个类别的 100000

    2024年02月03日
    浏览(38)
  • 【计算机视觉 | 图像分类】图像分类常用数据集及其介绍(九)

    乳腺癌组织病理学图像分类 (BreakHis) 由使用不同放大倍数(40 倍、100 倍、200 倍和 400 倍)从 82 名患者收集的 9,109 张乳腺肿瘤组织显微图像组成。 它包含 2,480 个良性样本和 5,429 个恶性样本(700X460 像素,3 通道 RGB,每个通道 8 位深度,PNG 格式)。 该数据库是与巴西巴拉那州

    2024年02月02日
    浏览(50)
  • 数据在计算机中的存储——【C语言】

    在前面的博客中,我们已经学习了C语言的数据类型,先让我们回顾一下C语言中有哪些数据类型。 目录 C语言的基本内置类型 类型的基本归类 整型在内存中的存储 原码、反码、补码 存储中的大小端 练习   浮点型在内存中的存储  浮点数的存储规则 对引例问题的深度分析

    2024年02月13日
    浏览(37)
  • 大端和小端

    大端(Big Endian)和小端(Little Endian)是两种不同的字节序排列方式,用于解释多字节数据在内存中的存储顺序。 在大端字节序中,高位字节(最高有效位)存储在低位地址,低位字节(最低有效位)存储在高位地址。简单来说,就是数据的高位字节先存储在内存的低地址,

    2024年02月13日
    浏览(31)
  • 1. 大端法和小端法

    一个 int32_t 是4个字节,在内存中的存储是高位字节在低地址,低位字节在高地址。 (数字)前者的高低是数字位数的高低,左边是高位数,右边是低位数; (地址)后者的高低是内存中的地址的大小,大的值就是高地址。 大端法: 小端法: 网络程序要考虑字节序的问题。

    2023年04月17日
    浏览(40)
  • 大端字节和小端字节

    介绍 大端字节序(Big-Endian)和小端字节序(Little-Endian)是在计算机系统中用来表示多字节数据类型(如整数、浮点数等)的存储方式。字节序指的是在内存中多字节数据的存放顺序,即哪个字节在前,哪个字节在后。 大端字节序(Big-Endian):在大端字节序中,最高有效字

    2024年02月10日
    浏览(34)
  • 计算机基础--计算机存储单位

    计算机中表示文件大小、数据载体的存储容量或进程的数据消耗的信息单位。在计算机内部,信息都是釆用二进制的形式进行存储、运算、处理和传输的。信息存储单位有位、字节和字等几种。各种存储设备存储容量单位有KB、MB、GB和TB等几种。 位(bit):二进制数中的一个

    2024年02月03日
    浏览(78)
  • keil_arm 大端小端 寄存器 栈

    @栈result   

    2024年02月11日
    浏览(34)
  • 大端字节序和小端字节序及应用场景

    小端字节序 存储和 大端字节序 存储是两种不同的数据存储方式,其区别在于对于多字节数据(如整数、浮点数等)的存储顺序不同。 小端字节序 存储(Little Endian)是指低位字节存储在内存的低地址处,高位字节存储在内存的高地址处。例如,32位整数0x12345678在内存中的存

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包