字节序 大端和小端

目录

  • 什么是 大端存储和小端存储?
  • 为什么会有大小端转换问题
  • 如何检查自己电脑 是大端还是小端?
  • 大端小端处理函数
    • 使用位运算操作来手动转换大端和小端。
    • 使用标准库中的htonl和ntohl函数
      • 代码示例:

什么是 大端存储和小端存储?

  • 大端模式(Big-endian):高字节存储在低地址,低字节存储在高地址。也就是说,数据的最高有效字节存储在内存的起始地址。
  • 小端模式(Little-endian):低字节存储在低地址,高字节存储在高地址。也就是说,数据的最低有效字节存储在内存的起始地址。

假设有一个32位整数0x12345678,在内存中占据4个字节。
在我们叫法中,二进制位有低位到高位,那么也要低字节到高字节。
在这里插入图片描述

  • 高字节存储在低地址,为大端
    在这里插入图片描述
  • 低字节存储在低地址为小端
    在这里插入图片描述

为什么会有大小端转换问题

1.硬件架构差异

  • 不同的计算机硬件架构采用不同的字节序。例如:大端模式(Big-endian):通常在一些网络协议和大型机系统(如IBM的大型机)中使用。小端模式(Little-endian):在大多数现代个人计算机、服务器、嵌入式系统中使用(如基于 x86和x86_64的系统)。
  • 当在不同硬件平台之间传递多字节数据时,如通过网络通信、文件存储或进程间通信,如果不处理字节序的差异,就可能导致数据解释错误。

2.网络协议的要求

  • 许多网络协议规定数据传输时必须使用特定的字节序。例如,TCP/IP协议使用大端序作为标准(也称为网络字节序)。因此,当数据在不同系统之间通过网传输时,可能需要在主机字节序与网络字节序之间进行转换。

3.文件和数据格式

  • 某些文件格式或数据格式(如图片、音频、视频、数据库文件等)规定了特定的字节序。例如,图像文件格式BMP在文件头中使用小端序存储数据。如果在大端模式的系统上读取或写入这种文件,需要进行字节序转换。

如何检查自己电脑 是大端还是小端?

可以通过联合体

#include <iostream>
using namespace std;union {int i;//4字节,32位char c[4];//4字节字符数组
}test;int  main()
{test.i = 0x12345678;//根据第一个字节的值判断大小端if (test.c[0] == 0x78){cout << "低字节放在低地址 为小端" << endl;}else if (test.c[0] == 0x12){cout << "高字节放在低地址 为大端" << endl;}else{cout << "无法确定字节序" << endl;}return 0;
}

大端小端处理函数

在C++中,处理大端(BigEndian)和小端(LittleEndian)存储的相关函数和方法通常与字节序的转换有关。 C++并没有内置的标准库函数专门用于处理大端和小端之间的转换,但可以通过以下几种方式来进行字节序的转换:

使用位运算操作来手动转换大端和小端。

以下是一个示例,将32位整数从小端转换为大端:

#include <iostream>
using namespace std;//将小端转换为大端
uint32_t littleToBigEndian(uint32_t littleEndian)
{return ((littleEndian & 0xFF000000) >> 24) |((littleEndian & 0x00FF0000) >> 8) |((littleEndian & 0x0000FF00) << 8) |((littleEndian & 0xFF0000FF) << 24);
}
int main()
{uint32_t littleEndian = 0x12345678;uint32_t bigEndian = littleToBigEndian(littleEndian);cout << hex << "小端: 0x" << littleEndian << endl;cout << hex << "大端: 0x" << bigEndian << endl;return 0;
}

使用标准库中的htonl和ntohl函数

在网络编程中,POSIX标准提供了htonl(Host to Network Long)、htons(Host to Network Short)、ntohl(Network to Host Long)和ntohs(Network to Host Short)这些函数用于字节序转换。这些函数可以用于转换16位和32位的整数。

  • htohl和ntohl:用于转换32位(long)的字节序。
  • htons和ntohs:用于转换16位(short)的字节序。

这些函数在<arpa/inet.h>(Linux/Unix)或<winsock2.h>(Windows)头文件中定义。

代码示例:

需要添加系统的lib。

#include <iostream>
#include <cstdint>
#include <WinSock2.h>using namespace std;int main()
{uint32_t hostOrder = 0x12345678;//主机转网络uint32_t networkOrder = htonl(hostOrder);cout << hex << "host : 0x" << hostOrder << endl;cout << hex << "Net : 0x" << networkOrder << endl;//网络转主机uint32_t hostConvertedBack = ntohl(networkOrder);cout << hex << "hostConvertedBack : 0x" << hostConvertedBack << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kylin Linux V10 替换安装源,并在服务器上启用 EPEL 仓库

查看系统版本&#xff1a; cat /etc/os-releaseNAME"Kylin Linux Advanced Server" VERSION"V10 (Lance)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Lance)" ANSI_COLOR"0;31"u…

可以用于分割字符串的方法(python)

一、str.split(sep,maxsplit)函数&#xff08;返回列表&#xff09; sep&#xff1a;分隔符 maxsplit&#xff1a;分割次数 a"Hello world" list1a.split(" ",1) print(list1) 结果&#xff1a; [Hello, world] 二、str.rsplit(sep,maxsplit)函数&…

[MySQL | 二、基本数据类型]

基本数据类型 一、数值类型举例表结构1. 整数类型zerofill属性 与 int(n) 中 n 的关系 2.bit类型3. 小数类型float类型decimal类型 二、字符串类型1. char2. varchar如何选择定长或变长字符串&#xff1f; 3. 日期时间类型(date datetime timestamp)4. enum枚举类型5. set多选类…

金融项目实战 03|JMeter脚本实现手工接口测试

目录 一、环境说明 1、项目环境搭建 2、Mock说明 二、构造测试数据 1、通过系统页面构造 2、通过接口构造 3、通过数据库构造【推荐】 4、案例&#xff1a;构造借款业务数据 三、JMeter执行接口测试用例 1、获取图片验证码、获取短信验证码 2、注册脚本 3、登录脚本…

【优先算法】滑动窗口--(结合例题讲解解题思路)(C++)

目录 1. 例题1&#xff1a;最大连续1的个数 1.1 解题思路 1.2代码实现 1.3 错误示范如下&#xff1a;我最开始写了一种&#xff0c;但是解答错误&#xff0c;请看&#xff0c;给大家做个参考 2. 将 x 减到 0 的最小操作数 2.1解题思路 2.2代码实现 1. 例题1&#xff…

JDK17语法新增

1.yield关键字: 2.var关键字&#xff1a; 3.密封类&#xff1a; ⼀般应⽤在类和接⼝中&#xff0c;对接⼝和类的实现和继承进⾏约束。主要使⽤的关键字是 final 。当这个类被 final 修饰了&#xff0c;被修饰的类就变成完全封闭的状态了&#xff0c;所有类都没办法继承。…

Go可以使用设计模式,但绝不是《设计模式》中的那样

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…

TCP 序列和确认号说明 | seq 和 ack 号计算方法

注&#xff1a;本文为 “TCP 序列” 相关文章合辑。 英文引文机翻未校。 TCP Sequence and Acknowledgement Numbers Explained TCP 序列和确认编号说明 TCP Sequence (seq) and Acknowledgement (ack) numbers help enable ordered reliable data transfer for TCP streams…

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo

1.策略模式 好处&#xff1a;动态切换算法或行为场景&#xff1a;实现同一功能用到不同的算法时和简单工厂对比&#xff1a;简单工厂是通过参数创建对象&#xff0c;调用同一个方法&#xff08;实现细节不同&#xff09;&#xff1b;策略模式是上下文切换对象&#xff0c;调用…

《数据思维》之数据可视化_读书笔记

文章目录 系列文章目录前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 数据之道&#xff0c;路漫漫其修远兮&#xff0c;吾将上下而求索。 一、数据可视化 最基础的数据可视化方法就是统计图。一个好的统计图应该满足四个标准&#xff1a;准确、有…

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout&#xff08;检出&#xff09;到 Pycharm中 2、推送…

maven 项目怎么指定打包后名字

在 Spring Boot 的 Maven 项目中&#xff0c;你可以通过配置 pom.xml 文件来指定打包后的文件名。具体步骤如下&#xff1a; 打开 pom.xml 文件&#xff1a;找到你的项目根目录下的 pom.xml 文件。 配置 finalName 属性&#xff1a;在 标签下&#xff0c;添加 属性来指定打包后…

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时&#xff0c;Kafka Listener 的默认行为是开始监听某个主题。但是&#xff0c;有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener&#xff0c;我们需要三种主要方法…

前端常见的设计模式之【单例模式】

前端常见的设计模式&#xff1a; 单例模式观察者模式工厂模式适配器模式装饰器模式命令模式迭代器模式组合模式策略模式发布订阅模式 单例模式【创建型设计模式】&#xff1a; 单例模式是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这个模式非常适合那些需要…

C++|CRC校验总结

参考&#xff1a; Vector - CAPL - CRC算法介绍 开发工具 > CRC校验工具 文章目录 简介CRC-8CRC-16CRC-32 简介 循环冗余校验&#xff08;Cyclic Redundancy Check&#xff0c;简称CRC&#xff09;是一种数据校验算法&#xff0c;广泛用于检测数据传输或存储过程中的错误。…

# c语言:数组详解一

c语言&#xff1a;数组详解一 数组数组的概念引例&#xff1a;什么是数组数组的特征&#xff1a;下标&#xff08;索引&#xff09; 常用的数组按维度划分一维数组数组的定义&#xff1a;数组元素的访问数组的初始化**案例一、斐波拉契数列&#xff1a;****案例二、冒泡排序&am…

c#-Halcon入门教程——标定

Halcon代码 read_image (NinePointCalibration, D:/Desktop/halcon/ca74d-main/九点标定/NinePointCalibration.gif)rgb1_to_gray (NinePointCalibration, GrayImage)get_image_size (GrayImage, Width, Height) dev_display (GrayImage)* 获取当前显示的窗口句柄 dev_get_win…

语音识别的预训练模型

语音识别的预训练模型 语音识别模型 大致分为两类: 连接时序分类(Connectionist Temporal Classification, CTC):仅编码器(encoder-only)的模型,顶部带有线性分类(CTC)头序列到序列(Sequence-to-sequence, Seq2Seq):编码器-解码器(encoder-decoder)模型,编码器…

Kotlin 协程基础十 —— 协作、互斥锁与共享变量

Kotlin 协程基础系列&#xff1a; Kotlin 协程基础一 —— 总体知识概述 Kotlin 协程基础二 —— 结构化并发&#xff08;一&#xff09; Kotlin 协程基础三 —— 结构化并发&#xff08;二&#xff09; Kotlin 协程基础四 —— CoroutineScope 与 CoroutineContext Kotlin 协程…