当前位置: 首页 > article >正文

linux-c 字节序问题--大小端

今天面试被问了一个网络字节系列的问题分享一下:

 1.如何将Int转换成byte数组在网络上传输。

 2.计算机世界里的大小端问题。        

 计算机世界里为什么有大小端

硬件设计因素

  • CPU 架构差异
    • 不同的 CPU 架构在设计时,对于多字节数据在内存中的存储顺序有不同的考量。例如,x86 架构的 CPU 采用小端字节序,这是因为小端字节序在进行数据的低字节操作时更加方便。在 x86 架构中,数据的加载和存储操作通常从低地址开始,小端字节序使得低位字节存于低地址,在进行如加法、减法等运算时,能够直接从低地址开始处理数据,减少了额外的转换步骤,提高了硬件处理的效率。
    • 而一些网络设备和早期的大型计算机系统,如 IBM 的大型机,则采用大端字节序。大端字节序符合人类阅读和书写数字的习惯,高位字节在前,低位字节在后,在进行数据的比较和显示时更加直观,便于硬件设计人员进行调试和维护。
  • 内存访问效率
    • 小端字节序在处理数据时,对于低位字节的访问更加高效。因为计算机在进行数据处理时,常常需要先处理数据的低位部分,小端字节序将低位字节存于低地址,使得 CPU 可以直接从低地址开始读取和处理数据,减少了地址计算和数据移位的操作,提高了内存访问的效率。
    • 大端字节序在进行数据的整体比较和传输时具有优势。例如,在进行网络数据传输时,大端字节序可以直接将数据按顺序发送,接收方也可以按顺序接收和解析,避免了额外的字节序转换操作。

历史发展因素

  • 早期计算机设计的影响
    • 在计算机发展的早期,不同的计算机制造商和研发团队根据自己的设计理念和技术水平,选择了不同的字节序。这些早期的设计决策在后续的发展中逐渐形成了各自的标准和习惯,并且由于兼容性和成本的考虑,很难在后续的产品中进行大规模的更改。因此,不同的字节序得以保留并延续至今。
  • 行业标准和规范
    • 随着计算机技术的发展,不同的行业和领域逐渐形成了各自的标准和规范。例如,网络通信领域采用大端字节序作为网络字节序,这是为了确保不同的计算机系统在进行网络通信时能够正确解析数据。而在一些嵌入式系统和特定的应用场景中,可能会根据硬件平台和应用需求选择小端字节序。

不同场景下的数据处理需求

  • 数据显示和比较
    • 大端字节序在数据的显示和比较方面更加直观。例如,在显示一个多字节的整数时,大端字节序可以直接将高位字节显示在前面,符合人类的阅读习惯。在进行数据比较时,大端字节序也可以直接按字节顺序进行比较,无需进行额外的转换。
    • 小端字节序在数据处理和运算方面更加高效。在进行数据的加法、减法等运算时,小端字节序可以直接从低位字节开始处理,减少了数据移位和地址计算的操作。
  • 数据传输和存储
    • 在网络数据传输中,为了确保不同的计算机系统能够正确解析数据,通常采用大端字节序作为网络字节序。这样,发送方在发送数据时将数据转换为大端字节序,接收方在接收数据后再将其转换为本地字节序,从而保证了数据的正确传输和解析。
    • 在数据存储方面,不同的存储设备和文件格式可能采用不同的字节序。例如,一些图像文件格式采用大端字节序,而一些数据库系统则可能采用小端字节序。在进行数据存储和读取时,需要根据具体的存储设备和文件格式进行字节序的转换。

图示如下大小端如何存储

地址编号:   0       1     2      3      4    5    6    7
存储单元:[0x12] [0x34] [0x56] [0x78] [  ] [  ] [  ] [  ]  0X12345678 大端, 4个byte
存储单元:[0x78] [0x56] [0x34] [0x12] [  ] [  ] [  ] [  ]  0X12345678 小端, 4个byte相同的值:字节数据的存储顺序时不同的。 我们用C的伪代码来表示一下如何转换intToByteArrayuint8_t byteArr[4] = {}(0X123456789 >> 24) &&0XFF = 0X12  byteArry[0]= 0X12(0X123456789 >> 16) && 0XFF = 0X34   byteArry[1]= 0X34(0X123456789 >> 8) && 0XFF = 0X56   byteArry[2]= 0X56(0X123456789) && 0XFF = 0X89  byteArry[3]= 0X89int INT_SIZE = sizeof(int);
//下面提供C代码,大端存储
void intToByteArray(int num, unsigned char byteArray[INT_SIZE]) {for (int i = 0; i < INT_SIZE; i++) {// 右移 (INT_SIZE - 1 - i) * 8 位,将当前要提取的字节移到最低 8 位// 然后使用按位与操作符 & 0xFF 提取出最低 8 位的值byteArray[i] = (num >> ((INT_SIZE - 1 - i) * 8)) & 0xFF;}
}
大端byte转int
int byteArrayToInt(const unsigned char* bytes, size_t length) {int value = 0;for (size_t i = 0; i < length; ++i) {value |= (int)bytes[i] << ((length - 1 - i) * 8);}return value;
}//小端存储。高地址存储的是数据高位。低地址存储的是数据的地位。byte[3]存储的0x12,byte[0] = 0x89
(0X123456789) && 0XFF = 0X89  byteArry[0]= 0X89(0X123456789 >> 8) && 0XFF = 0X56   
byteArry[1]= 0X56(0X123456789 >> 16) && 0XFF = 0X34   
byteArry[2]= 0X34(0X123456789 >> 24) &&0XFF = 0X12  
byteArry[3]= 0X12//c代码提供如下:
void intToByteArrayLittleEndian(int num, unsigned char byteArray[INT_SIZE]) {for (int i = 0; i < INT_SIZE; i++) {byteArray[i] = (num >> (i * 8)) & 0xFF;}
}int byteArrayToIntLittleEndian(const unsigned char* bytes, size_t length) {int value = 0;for (size_t i = 0; i < length; ++i) {value |= (int)bytes[i] << (i * 8);}return value;
}

相关文章:

linux-c 字节序问题--大小端

今天面试被问了一个网络字节系列的问题分享一下&#xff1a; 1.如何将Int转换成byte数组在网络上传输。 2.计算机世界里的大小端问题。 计算机世界里为什么有大小端 硬件设计因素 CPU 架构差异 不同的 CPU 架构在设计时&#xff0c;对于多字节数据在内存中的存储顺序…...

java医院多维度综合绩效考核源码,医院绩效管理系统,支持一键核算和批量操作,设有审核机制,允许数据修正

医院绩效考核管理系统&#xff0c;java医院绩效核算系统源码&#xff0c;采用多维度综合绩效考核的形式&#xff0c;针对院内实际情况分别对工作量、KPI指标、科研、教学、管理等进行全面考核。医院可结合实际需求&#xff0c;对考核方案中各维度进行灵活配置&#xff0c;对各维…...

C语言学习笔记-初阶(13)scanf介绍

当我们有了变量&#xff0c;我们需要给变量输入值就可以使用 scanf 函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用 printf 函数&#xff0c;下面看⼀个例子&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:")…...

Android MMKV集成指南

首先简单介绍一下MMKV当下Android Studio最版本及Gradle8.7 MMKV集成根据官方文档重新对mmkv重新包了一次(便于开发)总结首先简单介绍一下MMKV MMKV 是腾讯开源的一款专为移动端设计的高性能键值存储组件,旨在替代传统的 SharedPreferences 和 SQLite,尤其在频繁读写和数据…...

如何让传统制造企业从0到1实现数字化突破?

随着全球制造业不断向智能化、数字化转型&#xff0c;传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新&#xff0c;更是管理、文化、业务流程等全方位的变革。从零开始&#xff0c;如何带领一家传统制造企业走向数字化突破&#xff0c;是许多企业领导者面…...

Centos7安装Python3.13

Centos7.5环境上安装Python3.13 # 安装依赖 yum install -y zlib zlib-devel openssl-devel sqlite-devel bzip2-devel libffi libffi-devel gcc gcc-c mkdir -p /opt/software cd /opt/software # openssl高版本安装 # 如果 Centos7 系统默认自带的 openssl 版本太低&#xf…...

C++之string类的模拟实现(超详细)

们学习东西&#xff0c;先学习如果使用它&#xff0c;然后再学习如何实现它 文章目录 目录 1. 命名空间以及头文件 2.string类的成员变量 3.string类的成员函数 3.1 构造函数 3.2 析构函数 3.3 拷贝构造函数 3.4 赋值运算符重载 3.5 c_str函数 3.6 size函数 3.7 clea…...

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取 一、问题背景 政府的icp备案时&#xff0c;或者某些三方SDK以来的管理后台&#xff0c;都需要配置鸿蒙应用的公钥和证书MD5指纹 二、解决方案 专有名词解释&#xff1a; 华为AppGallery Connect简称 AGC平台&#xff0…...

【原创工具】同文件夹PDF文件合并 By怜渠客

【原创工具】同文件夹PDF文件合并 By怜渠客 原贴&#xff1a;可批量合并多个文件夹内的pdf工具 - 吾爱破解 - 52pojie.cn 他这个存在一些问题&#xff0c;并非是软件内自主实现的PDF合并&#xff0c;而是调用的pdftk这一工具&#xff0c;但楼主并没有提供pdftk&#xff0c;而…...

【红队利器】单文件一键结束火绒6.0

关于我们 4SecNet 团队专注于网络安全攻防研究&#xff0c;目前团队成员分布在国内多家顶级安全厂商的核心部门&#xff0c;包括安全研究领域、攻防实验室等&#xff0c;汇聚了行业内的顶尖技术力量。团队在病毒木马逆向分析、APT 追踪、破解技术、漏洞分析、红队工具开发等多个…...

Linux中文件目录类指令

1、pwd指令 基本语法&#xff1a;pwd 功能&#xff1a;显示当前工作目录的绝对路径 1.相对路径访问和绝对路径访问 当前处于home目录下&#xff0c;访问a.txt文件 相对路径访问&#xff1a;kim/better/a.txt&#xff0c;从当前位置开始定位 绝对路径访问&#xff1a;/home…...

vue2项目打包后js文件过大, 首次加载缓慢

vue2项目打包后js文件过大, 首次加载缓慢 安装插件 npm i compression-webpack-plugin6.1.1 -D配置vue.config.js const CompressionWebpackPlugin require(compression-webpack-plugin)module.exports {configureWebpack: {plugins:[new CompressionWebpackPlugin({filen…...

【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片

【DeepSeek】-macOS本地终端部署后运行DeepSeek如何分析图片 根据您的需求&#xff0c;目前需要了解以下几个关键点及分步解决方案&#xff1a; --- 一、现状分析 1. Ollama 的限制&#xff1a; - 目前Ollama主要面向文本大模型&#xff0c;原生不支持直接上传/处理图片 …...

开源模型应用落地-LangChain实用小技巧-获取token消耗(五)

一、前言 在当今的自然语言处理领域&#xff0c;LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧&#xff0c;能够让您在使用 LangChain 框架时更加得心应手&#xff0c;从而更高效地开发出优质的自然语言处理应用。 计算 Token 消耗对有效管理和优化语…...

mfy学习笔记

创建表并导入数据 CREATE TABLE sales (id INT,salesperson STRING,region STRING,sales_amount INT,sale_date DATE );INSERT INTO sales (id, salesperson, region, sales_amount, sale_date) VALUES (1, Alice, North, 1000, 2023-01-01), (2, Bob, South, 1500, 2023-01-0…...

LangChain大模型应用开发:LangGraph快速构建Agent工作流应用

介绍 大家好&#xff0c;博主又来给大家分享知识了。今天给大家分享的内容是使用LangChain进行大规模应用开发中的LangGraph快速构建Agent工作流应用。 通过对前几次对LangChain的技术分享。我们知道LangChain作为一个强大的工具集&#xff0c;为开发者们提供了丰富的资源和便…...

鸿蒙Next-方法装饰器以及防抖方法注解实现

以下是关于 鸿蒙Next&#xff08;HarmonyOS NEXT&#xff09;中 MethodDecorator 的详细介绍及使用指南&#xff0c;结合了多个技术来源的实践总结&#xff1a; 一、MethodDecorator 的概念与作用 MethodDecorator 是鸿蒙Next框架中用于装饰类方法的装饰器&#xff0c;属于 Ark…...

神经网络发展简史:从感知机到通用智能的进化之路

引言 神经网络作为人工智能的核心技术&#xff0c;其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角&#xff0c;梳理神经网络发展的五大关键阶段&#xff0c;结合具象化比喻和经典案例&#xff0c;为读者呈现一幅清晰的AI算法发展图谱。 一…...

计算机网络:应用层 —— 电子邮件

文章目录 电子邮件的起源与发展电子邮件的组成电子邮件协议邮件发送和接收过程邮件发送协议SMTP协议多用途因特网邮件扩展MIME 电子邮件的信息格式 邮件读取协议邮局协议POP因特网邮件访问协议IMAP 基于万维网的电子邮件 电子邮件&#xff08;E-mail&#xff09;是因特网上最早…...

zyNo.26

[GXYCTF2019]Ping Ping Ping&#xff08;Web&#xff09; 传/&#xff1f;ip1有ping回显&#xff0c;说明后端可能通过php参数接受了ip参数&#xff0c;并且拼接到了最终执行的命令里形成了ping -c 3$ip&#xff0c;这样可能存在一个命令注入漏洞 要判断是否符合 ping -c 3$ip …...

结构型模式 - 适配器模式 (Adapter Pattern)

结构型模式 - 适配器模式 (Adapter Pattern) 适配器模式是一种结构型设计模式&#xff0c;它允许将一个类的接口转换成客户希望的另一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 类适配器&#xff0c;适用于要适配的类是一个接口&#xf…...

Linux 驱动模块稳定性检测框架 - 概要设计

Linux 驱动模块稳定性检测框架 1. 设计目标 实时监控&#xff1a;检测 Linux 设备驱动模块运行状态&#xff0c;及时发现异常。数据采集&#xff1a;通过内核打点&#xff0c;收集关键运行数据&#xff0c;分析模块稳定性。异常检测&#xff1a;分析错误日志、性能指标&#…...

ui设计公司兰亭妙微分享:科研单位UI界面设计

科研单位的UI界面设计是一项至关重要的任务&#xff0c;它不仅关乎科研工作的效率&#xff0c;还直接影响到科研人员的用户体验。以下是对科研单位UI界面设计的详细分析&#xff1a; 一、设计目标 科研单位的UI界面设计旨在提升科研工作的效率与便捷性&#xff0c;同时确保科…...

c# —— StringBuilder 类

StringBuilder 类是 C# 和其他一些基于 .NET Framework 的编程语言中的一个类&#xff0c;它位于 System.Text 命名空间下。StringBuilder 类表示一个可变的字符序列&#xff0c;它是为了提供一种比直接使用字符串连接操作更加高效的方式来构建或修改字符串。 与 C# 中的 stri…...

OpenGL ES -> GLSurfaceView绘制点、线、三角形、正方形、圆(顶点法绘制)

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…...

React + TypeScript 全栈开发最佳实践

React TypeScript 全栈开发最佳实践 一、环境搭建与项目初始化 node.js和npm的安装请参考我的文章。 1.1 脚手架选择与工程创建 # 使用Vite 5.x创建ReactTS项目&#xff08;2025年主流方案&#xff09; npx create-vitelatest my-app --template react-ts cd my-app npm in…...

AndroidAOSP定制隐藏某个应用的图标

AndroidAOSP定制隐藏某个应用的图标 1.前言: 之前在做AOSP定制的时候需要隐藏某些App的图标&#xff0c;或者默认不显示某个定制的App图标&#xff0c;这样可以让用户感觉不到已经安装了某个App,或者在做系统定制的时候需要修改桌面icon,有些系统的App图标默认不需要显示&…...

最小化重投影误差求解PnP

问题描述 已知n个空间点 P i [ x i , y i , z i ] T P_i[x_i,y_i,z_i]^T Pi​[xi​,yi​,zi​]T&#xff0c;其投影的像素坐标 p i [ u i , v i ] T p_i[u_i,v_i]^T pi​[ui​,vi​]T求相机的位姿R&#xff0c;T。 问题分析 根据相机模型&#xff0c;像素点和空间点的位置…...

玩转Docker | 使用Docker部署IT-tools工具箱

玩转Docker | 使用Docker部署IT-tools工具箱 前言一、 IT-tools介绍简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署IT-tools服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问IT-tools应用五、测试与使用六、总结前言 在信息技…...

unity学习52:UI的最基础组件 rect transform,锚点anchor,支点/轴心点 pivot

目录 1 image 图像&#xff1a;最简单的UI 1.1 图像的基本属性 1.2 rect transform 1.3 image的component: 精灵 → 图片 1.4 修改颜色color 1.5 修改材质 1.6 raycast target 1.7 maskable 可遮罩 1.8 imageType 1.9 native size 原生大小 2 rect transform 2.1 …...