大端和小端传输字节序

article/2025/9/24 21:55:07

大端和小端

在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit。在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过sizeof来获取不同类型在内存中占用的字节数。在计算机系统中,当物理单位的长度大于1个字节时,就要区分字节顺序。常见的字节顺序有两种:Big Endian(High-byte first) 和 Litter Endian(Low-byte first),当然还有其他字节顺序,但不常见,例如Middle Endian。

一、最高有效位、最低有效位

要理解Big Endian和Little Endian,首先要搞清楚MSB和LSB。
1.MSB(Most significant Bit)最高有效位

在一个n位二进制数字中n-1位,也就是最左边的位。

2.LSB(Least Significant Bit)最低有效位

指最右边的位。

例如:一个int类型的整形123456789
二进制表达方式: 0000 0111 0101 1011 1100 1101 0001 0101(从右向左,每4bit对齐,最左边(高位)不够用0补齐)
十六进制表达方式:0 7 5 B C D 1 5

按照上述关于MSB和LSB的意思,在二进制表达方式中,bit从0开始,从右向左,bit 0位最低有效位,而bit 23为最高有效位。而我们一般称左边的0x07为高位字节,0x15为低位字节。
再通俗一点解释就是:8421的,8这端为高位,1这端为低位,相应的字节则分别称为高位字节和低位字节。

二、内存地址

在内存中,多字节对象都是被存储为连续的字节序列。例如在C语言中,一个类型为int的变量n,如果其存储的首个字节的地址为0x1000,那么剩余3个字节地址将存储在0x1001~0x1003。总之,不管具体字节顺序是以什么方式排列,内存地址的分配一般是从小到大的增长。 我们常把0x1000称为低地址端,把0x1003称为高地址端。

三、大端和小端

搞清楚MSB、LSB、高位字节、低位字节之后,再理解大端和小端,就相当容易了,先看看概念:

小端Little Endian:低字节存放在低地址,低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
大端Big Endian:高字节存放在低地址,即高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

以二节中的例子int类型整数123456789位例:

小端在内存中排列: 0x15 0xCD 0x5B 0x07(低位在前)
大端在内存中排列: 0x07 0x5B 0xCD 0x15(高位在前)

从例子中可以看出小端比较符合人的思维,而大端则看上去非常直观。
注:
1.例子中是假设编译器支持int为32位的前提下,如果是16位,那大端的排列则为0xCD 0x15 0x07 0x5B
2.大小端一般是由CPU架构决定,常见的Intel、AMD的CPU使用的是小端字节,而PowerPC使用的是大端字节序,有些ARM处理器还可以选择大端还是小端模式,具体自行查阅。
3.C#中,字节序跟编译平台所在的CPU相关,例如在Intel x86 CPU架构的windows平台中,C#采用的小端序。而Java由于JVM屏蔽不了不同CPU架构导致额字节序差异,所以默认采用大端字节。所以,大小端模式是由CPU决定,而编译器又可能会改变这种模式。

在这里插入图片描述

四、网络字节序和主机字节序

网络字节序(Network Order):TCP/IP各层协议将字节序定义为Big Endian,因此TCP/IP协议中的字节序同称之为网络字节序。
主机字节序(Host Order):整数在内存中保存的顺序,它遵循Little Endian规则(不一定,要看主机的CPU架构)。所以当两台主机之间要通过TCP/IP协议进行通信的时候就需要调用相应的函数进行主机序列(Little Endian)和网络序(Big Endian)的转换。

如果是做跨平台开发时,双方需要协商好字节序,然后根据程序运行的环境,确定是否需要字节序转换。
例如约定的通讯字节序位是Big Endian,默认的window采用的Little Endian,那收到数据后就需要做转换操作。

五、C#位操作符

这里简单记录一下C#位操作符,方便以后自己查阅,也方便理解后面的讲解。

  1. 按位与&
    1&0为0;0&0为0;1&1为1
  2. 按位与|
    1|0为1;0|0为0;1|1为1
  3. 按位取反~
    ~1为0; ~0为1;
  4. 按位异或^
    1^1为0; 0^0为0; 1^0为1;
  5. 左移<<
    位左移运算,将整个数向左移若干位,左移后空出的部分0补齐
  6. 右移>>
    位右移运算,将整个数向右移若干位,右移后空出的部分用0补齐

六、C#中关于大端和小端的转换

1.重复轮子

using System;namespace Framework.NetPackage.Common
{/// <summary>/// 字节序转换辅助类/// </summary>public static class Endian{public static short SwapInt16(this short n){return (short)(((n & 0xff) << 8) | ((n >> 8) & 0xff));}public static ushort SwapUInt16(this ushort n){return (ushort)(((n & 0xff) << 8) | ((n >> 8) & 0xff));}public static int SwapInt32(this int n){return (int)(((SwapInt16((short)n) & 0xffff) << 0x10) |(SwapInt16((short)(n >> 0x10)) & 0xffff));}public static uint SwapUInt32(this uint n){return (uint)(((SwapUInt16((ushort)n) & 0xffff) << 0x10) |(SwapUInt16((ushort)(n >> 0x10)) & 0xffff));}public static long SwapInt64(this long n){return (long)(((SwapInt32((int)n) & 0xffffffffL) << 0x20) |(SwapInt32((int)(n >> 0x20)) & 0xffffffffL));}public static ulong SwapUInt64(this ulong n){return (ulong)(((SwapUInt32((uint)n) & 0xffffffffL) << 0x20) |(SwapUInt32((uint)(n >> 0x20)) & 0xffffffffL));}}
}

2.BCL库支持的函数
System.Net.IPaddress.HostToNetworkOrder、System.Net.IPAddress.NetworkToHostOrder,这两个函数的内容实现和上面重复轮子原理一样。

七、关于负数

在计算机中,负数以及其绝对值的补码形式表示,不明白可以查阅九中贴出的相关资源。关于负数的字节序跟一般整数的字节序处理没有任何区别。

八、关于汉字编码以及与字节序的关系

1.对于gb2312、gbk、gb1&8030、bigs,其编码某个汉字产生的字节顺序,由某编码方案本身决定,不受CPU字节序的影响。其实这几种编码的字节序和大端模式的顺序是一致的。
在这里插入图片描述
2.UTF-8
UTF-8和gb系列编码一样,其编码某个汉字产生的字节顺序,由其编码方案决定,不受CPU字节序的影响。无论一个汉字有多少个字节,它的字节序与编码顺序保持一致。
在这里插入图片描述
3、Unicode

Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。所以他没有要求如何存储编码后的字节,也就受CPU字节序的影响。

Unicode的具体实现包括UTF-16、UTF-32(当然也包括UTF-8,但由于其编码方式和编码后的字节序与其他Unicode编码实现有较大区别,所以单独拿出来讲解的)。

4、总结

1、网络通讯

在实际的网络通讯中,网络协议例如TCP是规定网络字节序(Network Order)是大端。而针对汉字具体使用什么编码,通讯双方要么提前约定好,要么就需要在数据包中标识好汉字具体使用的编码。

如果在网络通讯中,涉及例如UTF16这样区分大小端的编码,除非按网络协议要求采用大端模式是,否则也要事先约定好,或者在数据包中标识好使用的字节序模式。

2、文件

文件的也会存储汉字,当然也要进行编码。如果采用UTF-16这样的有字节序模式区分的编码,编码规则要求可以在文件头部的BOM(Byte Order Mark)来标记。如果没有标记,除非事先知道字节序的模式,否则只能大小端都试一遍。在这里插入图片描述


http://chatgpt.dhexx.cn/article/Sx6JKqHC.shtml

相关文章

大端字节序和小端字节序

字节序&#xff0c;即字节在电脑中存放时的序列与输入&#xff08;输出&#xff09;时的序列是先到的在前还是后到的在前。 -- 转自&#xff1a;字节序_百度百科 (baidu.com) 在几乎所有的平台上&#xff0c;多字节对象都被存储为连续的字节序列。例如在 C 语言中&#xff0c;一…

简单理解大端小端

大端和小端是计算机写内存的习惯。就如人类写文章时的顺序一般&#xff0c;现代人从左往右&#xff0c;古人却是竖书成行&#xff08;自上而下写满一行后&#xff0c;再自右向左换行。&#xff09;&#xff1b;有些计算机规定从左往右写内存&#xff0c;有些规定从右往左写内存…

java 为什么用大端_Java中的大端和小端

Java整型的字节序是() A.Little-Endian(小端) B.Big-Endian(大端) C.由运行程序的CPU决定 D.由编译程序的CPU决定 对于大小端&#xff0c;我估计肯定有很多开发人员跟我一样都没听过 由于Java是跨平台的&#xff0c;JVM为我们屏蔽了大量的底层细节和复杂性&#xff0c;导致在平…

存储模型:大端和小端

前言&#xff1a; 计算机操作系统中存储信息都是以字节为单位&#xff0c;每个地址单元对应 1 个字节。 1 个字节为 8 bits&#xff0c;对于某些32 位处理器而言&#xff0c;char类型数据占用 1 个字节的空间&#xff0c;short 占用2个字节&#xff0c;int 占用4个字节。而这…

操作系统之大端小端

1. 什么是大端,什么是小端: 所谓的大端模式&#xff0c;是指数据的低位保存在内存的高地址中&#xff0c;而数据的高位&#xff0c;保存在内存的低地址中&#xff1b; 所谓的小端模式&#xff0c;是指数据的低位保存在内存的低地址中&#xff0c;而数据的高位保存在内存的高地…

二进制、16进制、大端小端

16进制的使用 在开发过程中&#xff0c;写文件是常有的事&#xff0c;如果写的内容是文本&#xff0c;随便用一个记事本软件打开即可查看内容是否正确&#xff0c;如果写的是音频文件&#xff0c;就要用音频播放器来查看&#xff0c;如果是视频文件&#xff0c;就要用视频播放…

网络传输大端序_大端、小端与网络字节序

大端(Big-Endian)&#xff0c;小端(Little-Endian)以及网络字节序的概念在编程中经常会遇到。网络字节序(Network Byte Order)一般是指大端(Big-Endian&#xff0c;对大部分网络传输协议而言)传输&#xff0c;大端小端的概念是面向多字节数据类型的存储方式定义的&#xff0c;小…

677-大端模式和小端模式详解

1、大端和小端核心是什么&#xff1f; 大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式&#xff0c;总结如下&#xff1a; 大端模式&#xff1a;低地址对应高字节 小端模式&#xff1a;低地址对应低字节 不管是大端还是小端模式&#xff0c;我们在读取和存…

大端小端详解

转载&#xff1a;大端小端详解 1>"大端" "小端"的来源 关于大端小端名词的由来&#xff0c;网传有一个有趣的故事&#xff0c;可以追溯到1726年的Jonathan Swift的《格列佛游记》&#xff0c;其中一篇讲到有两个国家因为吃鸡蛋究竟是先打破较大的一端…

大端序发送数据

需要发送数字 151510 大端序发送就是 &#xff1a;00 02 4F D6 string smallData textBox1.Text;//小端数据if (smallData ""){MessageBox.Show("请输入初始里程", "错误",MessageBoxButtons.OK, MessageBoxIcon.Exclamation);textBox1.Text …

c语言之大端小端问题

这就是字节序问题&#xff1a;数据在计算机内存中存储或者网络传输时各字节的存储顺序 通常来说就分为两种情况&#xff1a; 一种是大端(big-endian)&#xff1a;高字节(高位)存放在低地址&#xff0c;低字节(低位)存在高地址 另外一种小端(little-endian)&#xff1a;高位存放…

数据存储:大端小端

文章目录 问题起源大端小端大端小端优劣符合人类阅读方式数据类型转换符号位的识别 参考资料 曾经辨析和了解过大端小端&#xff0c;但是到了实际应用中还是比较模糊。整理一些资料文章&#xff0c;在此记录。 问题起源 在计算机的使用以及现代很多的嵌入式设备中&#xff0c;…

大端与小端

一.大小端介绍 “大端”和“小端”表示多字节值的哪一端存储在该值的起始地址处。小端存储在起始地址处&#xff0c;即是小短字节序&#xff1b;大端存储在起始地址处&#xff0c;即是大端字节序。 大端存储模式&#xff1a;数据的低位保存在内存中的高地址中&#xff0c;数据…

大端和小端的含义及判断代码

1、概述 在计算机系统中&#xff0c;数据都是以字节进行存储的&#xff0c;每个地址单元对应一个字节&#xff0c;每个字节都是8位&#xff08;bit&#xff09;。但是C除了char和bool之外&#xff0c;还有其它多字节类型。怎样存储多字节的数据就分为了大端和小端。字节序只和…

C语言基础 —大端和小端

大端和小端 1、什么是大端和小端2、为什么会有大端和小端3、怎样判断是大端还是小端 1、什么是大端和小端 大端模式&#xff1a;就是 高位字节 存放在内存的 低地址端&#xff0c;低位字节 存放在内存的 高地址端 小端模式&#xff1a;就是 低字节存 放在内存的 低地址端&…

大端和小端的区别和判断

1.概念 大端模式(big endian)&#xff1a;数据的高位字节保存在内存的低地址中&#xff0c;而低位字节保存在内存的高地址中。 小端模式(little endian)&#xff1a;数据的高位字节保存在内存的高地址中&#xff0c;而低位字节保存在内存的低地址中。 问&#xff1a;什么是高…

什么是大端和小端

大端&#xff08;存储&#xff09;模式&#xff1a;是指数据的低位保存在内存的高地址中&#xff0c;而数据的高位保存在低地址中&#xff1b; 小端&#xff08;存储&#xff09;模式&#xff1a;是指数据的低位保存在内存的低地址中&#xff0c;而数据的高位保存在高地址中。 …

大端、小端的前世今生

什么是大端、小端&#xff1f; BigEndian(大端)&#xff1a;低字节在高内存地址 LittleEndian(小端)&#xff1a;低字节在低内存地址 所谓大端小端&#xff0c;也就是看低字节在高内存地址还是低内存地址&#xff0c;也就是看低字节在前还是高字节在前&#xff0c;低字节在前…

数据存储:小端模式和大端模式——终于搞明白了!!!

首先要记住&#xff1a;读数据永远是从低地址开始的&#xff01;&#xff01;&#xff01; 正文开始 什么是低地址、高地址&#xff1f; 地址编号小的是低地址&#xff0c;地址编号大的是高地址 什么是数据的低位、高位&#xff1f; 小端模式 数据的低位放在低地址空间&am…

室内定位技术(三)——自有定位技术

我们正在使用的技术是以wifi信号强度正态分布为核心&#xff0c;结合神经网络原理的一套完整算法&#xff0c;并对wifi信号的正态分布情况作了很多的优化工作。 以下是在两组wifi信号强度正态分布研究的实例图&#xff1a; 四条不同颜色的线分别代表不同的ap信号强度的正态分布…