大小端存储是什么鬼?
以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/htYGddzO2xPl9kDN4lANpQ
大小端存储的划分是为了解决长度大于一个字节的数据类型内容在存储地址上以不同顺序分布的问题。
比如16位的short整形,32位的int整形,64位的long整形,它们在存储地址上,其实最小的划分单位是字节,那么高低位的字节排列在从低到高的存储地址上有什么规定呢?
如果最高位的字节数据存在最低地址上,而次高位的字节数据按次序排列在次低的地址上,那么这种存储方式就叫大端存储。
如果最低位的字节数据存在最低地址上,而次低位的字节数据按次序排列在次低的地址上,那么这种存储方式就叫小端存储。
那么怎么去判断当前系统属于大端存储还是小端存储呢?
判断方法一:利用单字节类型强制转换多字节类型变量获取返回值比较
下面让我们看看实例代码:
#include <iostream>using namespace std;bool IsSystemBigEndianStorage()
{short src = 1;char comp = (char)src;return (comp == 0);
}int main()
{bool ret = IsSystemBigEndianStorage();if (ret) {cout << "big endian" << endl;} else {cout << "small endian" << endl;}return 0;
}
首先把单字节范围内的数据值(比如1)赋给更大长度的类型(比如2个字节的short)变量src,然后利用单字节长度的数据类型(char)强制转换变量src,会在内存空间上截取变量src对应存储在最低地址的一个字节数据并返回。
bool IsSystemBigEndianStorage()
{short src = 1;char comp = (char)src;return (comp == 0);
}
可以看到变量src的高位字节数据为0,低位字节数据为1,各不相同。

如果(char)src的返回值等于0,就表示存储在最低地址的字节数据等于高位字节数据0x00,属于大端存储,否则表示属于小端存储。
判断方法二:利用联合体类型union比较内部的单字节数据
修改一下上面的函数IsSystemBigEndianStorage:
bool IsSystemBigEndianStorage()
{union {short a;char b;} temp;temp.a = 1;return (temp.b == 0);
}
可以看到变量temp.a的高位字节数据为0,低位字节数据为1,各不相同。

根据内存空间中字节对齐的规律,联合体union类型,各成员变量的起始地址是一样的。即使各成员变量的数据长度不一样也不影响。
也就是说temp.a最低地址空间的数据内容就是temp.b的数据内容。

如果temp.b的值等于0,就表示存储在最低地址的字节数据等于高位字节数据0x00,属于大端存储,否则表示属于小端存储。
关于网络字节顺序
网络中充斥着各种各样的终端设备或者中间代理路由等,数据利用网络进行传输,传输的基本数据单位也是字节,于是多字节类型的数据也会面临大小端的传输顺序定义。
所以,在传输前和传输后的设备怎么同步这个多字节类型数据的存储呢?由传输前后端的设备共同决定吗?
比如两个不同地区的人碰到一起,如果没有约定俗成的共同语言,一样不知如何去交流。

在数据成功传送和解读完整前,数据两端的设备不会理解对方的意图,那么就有必要由第三方来统一明确定义传输顺序。
于是,TCP/IP 协议规定了网络传输多字节类型数据时,先传输高位的字节数据,次高位的字节数据在其后接着传输。而数据在被网络接口发送到网络时,需要从内存逐字节读取出来,从低地址往高地址开始发送。那么可见在网络传输中,数据的字节顺序形式是大端存储。
本地数据怎么和网络字节顺序转换?
下面针对本地系统为linux举个例子
从本地系统存储顺序转换为网络字节顺序
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
从网络字节顺序转换为本地系统存储顺序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
相关文章:
大小端存储是什么鬼?
以下内容为本人的著作,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/htYGddzO2xPl9kDN4lANpQ 大小端存储的划分是为了解决长度大于一个字节的数据类型内容在存储地址上以不同顺序分布的问题。 比如16位的short整形&…...
WEB:探索开源PDF.js技术应用
1、简述 PDF.js 是一个由 Mozilla 开发的开源 JavaScript 库,用于在浏览器中渲染 PDF 文档。它的目标是提供一个纯粹的前端解决方案,摆脱了依赖插件或外部程序的束缚,使得在任何支持 JavaScript 的浏览器中都可以轻松地显示 PDF 文档。 2、…...
数据分析之词云图绘制
试验任务概述:如下为所给CSDN博客信息表,分别汇总了ai, algo, big-data, blockchain, hardware, math, miniprog等7个标签的博客。对CSDN不同领域标签类别的博客内容进行词频统计,绘制词频统计图,并根据词频统计的结果绘制词云图。…...
【赠书第13期】边缘计算系统设计与实践
文章目录 前言 1 硬件架构设计 2 软件框架设计 3 网络结构设计 4 安全性、可扩展性和性能优化 5 推荐图书 6 粉丝福利 前言 边缘计算是一种新兴的计算模式,它将计算资源推向网络边缘,以更好地满足实时性、低延迟和大规模设备连接的需求。边缘计算…...
数据库01_增删改查
1、什么是数据?什么是数据库? 数据:描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库:存放数据的仓库,数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…...
MySQL——进阶篇
二、进阶篇🚩 1. 存储引擎🍆 1.1 MSQL体系结构 连接层: 连接处理,连接认证,每个客户端的权限 服务层: 绝大部分核心功能,可跨存储引擎 可插拔存储引擎: 需要的时候可以添加或拔掉…...
Python 网络编程之搭建简易服务器和客户端
用Python搭建简易的CS架构并通信 文章目录 用Python搭建简易的CS架构并通信前言一、基本结构二、代码编写1.服务器端2.客户端 三、效果展示总结 前言 本文主要是用Python写一个CS架构的东西,包括服务器和客户端。程序运行后在客户端输入消息,服务器端会…...
往年面试精选题目(前50道)
常用的集合和区别,list和set区别 Map:key-value键值对,常见的有:HashMap、Hashtable、ConcurrentHashMap以及TreeMap等。Map不能包含重复的key,但是可以包含相同的value。 Set:不包含重复元素的集合&#…...
解决服务器Tab键不能补全问题
编辑~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml 命令:vim ~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml替换:<property name“<Super>Tab” type“string” value“switch_window…...
人工智能 机器学习 深度学习:概念,关系,及区别说明
如果过去几年,您读过科技主题的文章,您可能会遇到一些新词汇,如人工智能(Artificial Intelligence)、机器学习(Machine Learning)和深度学习(Deep Learning)等。这三个词…...
数据库——LAMP的搭建及MySQL基操
1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机,在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作: (1)登录 MySQL,在 MySQL 中创建用户,并对…...
抗原设计与兔单B细胞技术的结合-卡梅德生物
随着生物医学研究的不断深入,抗体疗法作为治疗疾病的有力工具逐渐成为研究的焦点。而兔单B细胞技术作为抗体研究的创新方法,其与抗原设计的有机结合为获取定制抗体打开了崭新的创新之路。本文将深入探讨抗原设计与兔单B细胞技术相互融合的原理、优势&…...
在uniapp中使用背景渐变色与背景图不生效问题
list上有文字详情以及背景图,从背景可以看出是渐变色和 背景图片的结合。 因为使用到渐变色,所以要结合 background-blend-mode 属性来实现与背景图片叠加显示,否则只通过 background: linear-gradient(); background-image: url(); 设置不会…...
Java中XML的解析
1.采用第三方开元工具dom4j完成 使用步骤 1.导包dom4j的jar包 2.add as lib.... 3.创建核心对象, 读取xml得到Document对象 SAXReader sr new SAXReader(); Document doc sr.read(String path); 4.根据Document获取根元素对象 Element root doc.getRootElement(); …...
React快速入门之交互性
响应事件 创建事件处理函数 处理函数名常以handle事件名命名 function handlePlayClick() {alert(Playing);}传递事件处理函数 函数名、匿名两种方式! function PlayButton() {function handlePlayClick() {alert(Playing);}return (<Button handleClick{handl…...
浅谈WPF之ToolTip工具提示
在日常应用中,当鼠标放置在某些控件上时,都会有相应的信息提示,从软件易用性上来说,这是一个非常友好的功能设计。那在WPF中,如何进行控件信息提示呢?这就是本文需要介绍的ToolTip【工具提示】内容…...
Android Studio 如何隐藏默认标题栏
目录 前言 一、修改清单文件 二、修改代码 三、更多资源 前言 在 Android 应用中,通常会有一个默认的标题栏,用于显示应用的名称和一些操作按钮。但是,在某些情况下,我们可能需要隐藏默认的标题栏,例如自定义标题栏…...
对于c++的总结与思考
笔者觉得好用的学习方法:模板法 1.采用原因:由于刚从c语言面向过程的学习中解脱出来,立即把思路从面向过程转到面向对象肯定不现实,加之全新的复杂语法与操作,着实给新手学习这门语言带来了不小的困难。所以ÿ…...
Flask 账号详情展示
Flask 账号详情展示 这段代码是一个基于Flask框架的Python应用程序。 它包含了两部分代码:Python代码和HTML代码。 web/templates/common/tab_account.html <div class"row border-bottom"><div class"col-lg-12"><div cla…...
软件测试/测试开发丨Pytest 参数化用例
参数化 通过参数的方式传递数据,从而实现数据和脚本分离。并且可以实现用例的重复生成与执行。 参数化应用场景 测试登录场景 测试登录成功,登录失败(账号错误,密码错误)创建多种账号: 中⽂文账号,英⽂文账号 普通测试用例方法 …...
从USB2.0到USB3.0:硬件工程师必须知道的电源管理与布线升级要点(含电平转换案例)
从USB2.0到USB3.0:硬件工程师必须掌握的电源管理与布线升级实战指南 在硬件设计领域,接口技术的迭代往往带来性能的飞跃,但同时也伴随着设计复杂度的显著提升。USB3.0作为当前主流的高速接口标准,其传输速率相比USB2.0提升了近10倍…...
fpga开发过程中遇到的一些小问题
vivado开发过程中的一些error1、[Chipscope 16-213] The debug port u_ila_0/probe13 has 28 unconnected channels (bits). This will cause errors during implementation.2、ERROR: [Labtools 27-3312] Data read from hw_ila [hw_ila_1] is corrupted. Unable to upload wa…...
Newbie-Guideline数据库实战:SQL查询与ER模型设计的完整教程
Newbie-Guideline数据库实战:SQL查询与ER模型设计的完整教程 【免费下载链接】Newbie-Guideline 컴퓨터과학/공학 신입생 및 비전공자 신입을 위한 지침서 项目地址: https://gitcode.com/gh_mirrors/ne/Newbie-Guideline Newbie-Guideline是面向计算机科学/…...
KMS智能激活脚本:3分钟永久激活Windows和Office的终极指南
KMS智能激活脚本:3分钟永久激活Windows和Office的终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档突然变…...
04. 骨架:后端分层架构与 TypeScript 类型系统实战
写在前面: 很多 GIS 开发者在写后端时,容易陷入“脚本思维”:一个文件几千行,数据库查询、业务逻辑、接口响应全混在一起。刚开始跑得快,但随着功能增加,代码会变成一团难以维护的“意大利面”。 在 light-mvt-server 中,我们坚持采用企业级的分层架构。今天,我们将深入…...
Keil C编译器字符串常量合并机制与内存优化
1. Keil C编译器中的字符串常量合并机制解析在嵌入式开发中,内存优化是一个永恒的话题。Keil C编译器(包括C51、C166和C251版本)提供了一项智能特性——自动合并重复的字符串常量。这个功能看似简单,但对资源受限的嵌入式系统而言…...
X.509证书格式(SPDM协议)
字段名称含义用途示例待签名内容(tbsCertificate)Version (版本)含义: 证书版本号。取值: v1(0), v2(1), v3(2)。互联网 PKI 必须使用 v3 (值为 2)。告诉解析程序该按照哪个标准来读取后续的字段(目前绝大多数为 v3)。Version: 3 (0x2)Serial Number (序…...
yolo26 pt转onnx
from ultralytics import YOLOdef main():# 加载你训练好的 YOLO26 模型model YOLO("D:\\ultralytics\\runs\\detect\\train-3\\weights\\best.pt") # 请将 best.pt 替换为你实际的文件路径# 导出为 ONNX 格式model.export(format"onnx",imgsz(640,384),…...
从碰撞到安全路径:在MATLAB里为你的机械臂规划一条无碰撞轨迹(附完整代码)
七轴机械臂无碰撞轨迹规划实战:从MATLAB基础到高级避障策略 机械臂在复杂环境中的自主运动一直是工业自动化和服务机器人领域的核心挑战。想象一下,当一台七轴机械臂需要在布满障碍物的空间里精准抓取物品时,如何确保它不会撞上周围的工作台、…...
瑞萨RL78/F25电容触摸开发:从FSP配置到调试优化全解析
1. 项目概述与核心价值最近在做一个家电控制面板的项目,主控选型时看中了瑞萨的RL78/F25系列MCU。这个系列主打低功耗和高集成度,内置了电容式触摸感应单元(CTSU),对于需要触摸按键、滑条的应用来说,简直是…...
