清晰的理解大端和小端
首先从byte聊起:
最早的计算机有 4-bit、6-bit、7-bit 等好多种。IBM在 1950 年设计 IBM 7030 Stretch 的时候引入 byte 的概念,byte表示访问内存的最小单位。
布鲁克斯被问到:“您认为自己最大的技术成就是什么?”
Brooks回答说:“我做出的最重要的决定是将IBM 360系列从6位更改为8位字节,从而允许使用小写字母。这种变化传播到了所有地方。
微型计算机要到 1970 年代早期才出现,那个时候8位byte已经用了将近十年了,自然大家就继续使用了。
大端和小端:
byte表示访问内存的最小单位且为8个bit,这个是人为规定出来的,延续至今是个历史原因。有最小的储存单位,就有更大的储存单位,如int ,long ,一般情况下int 是32位的,long是64位的。
那 int 和 long 是由最小访问内存单位byte构成的,那么问题就来了,当byte构成 int 和 long时,顺序怎么放?于是就有了大端的摆放方式 和 小端的摆放方式,如下:
那其实,这里就可以看到,所谓的大小端是针对,比byte大的单位,内部的byte如何摆放的。
什么时候要进行大小端字节序的转换?
出现了大端和小端,说明是出现的分歧,有的地方,觉得小端好,有的地方,觉得大端好。那既然有了分歧,作为程序员,就多了一份转换的工作。
那那些地方用的大端那些地方用的小端?
Motorola的PowerPC系列CPU采用Big Endian方式存储数据。
Intel的x86系列CPU采用Little Endian方式存储数据。
ARM既可以工作在大端模式,也可以工作在小端模式。在ARM上,我见到的都是用Little Endian方式存储数据。
Windos(x86,x64)和Linux(x86,x64)都是Little Endian操作系统
C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的。
JAVA编写的程序则唯一采用Big Endian方式来存储数据。
所有网络协议也都是采用Big Endian的方式来传输数据的。所以有时我们也会把Big Endian方式称之为网络字节序。
知道了这些,大概就知道什么时候需要转换了。举几个例子:
c# 到网络
c#在windows平台上是小端字节序(Windos(x86,x64)和Linux(x86,x64)都是Little Endian操作系统,不止是c#)。网络发送字节流是按大端序发送,也就是从左到右发送,和c#的小端序相反,造成网关不能正常识别协议。所以需要转换。
c# 到JAVA
在你的C#程序传给JAVA程序之前有必要进行字节序的转换工作。
字符串不需要大小端转换
上面的转换其实针对的都是数字,应为顺序变了,数学的大小就变了,但是字符串不同,它有自己的编码顺序(UTF8 ASCC gb2312 等等)
所以,我们可以看到这样的代码:
/// <summary>/// 发送消息/// </summary>/// <param name="msg"></param>/// <returns></returns>public static byte[] BuildMsgCmd(string msg){var arr = new List<byte> { };//转为byte数组并进行大小端转换var byteHeader = BitConverter.GetBytes(HeartMsg).Reverse().ToList();//字符串不用进行大小端转换var byteMsg = Encoding.UTF8.GetBytes(msg);//转为byte数组并进行大小端转换var byteLength = BitConverter.GetBytes((ushort)byteMsg.Length).Reverse().ToList();arr.AddRange(byteHeader);arr.AddRange(byteLength);arr.AddRange(byteMsg);return arr.ToArray();}
数字相关的都进行了,大小端转换,字符串就不用了。
参考资料:
大小端字节序(Big Endian和Little Endian)_编程爱好者熊浪的博客-CSDN博客_大小端字节序
为什么一个字节定义成8位? - 知乎 (zhihu.com)
清晰的理解大端和小端相关推荐
- 深入理解计算机大端与小端
大端与小端 在嵌入式开发中,大端(Big-endian)和小端(Little-endian)是一个很重要的概念. MSB与LSB 节序的问题,必然牵涉到两大CPU派系.那就是Motorola的Powe ...
- mysql是大端小端_大端和小端 - HackerVirus - 博客园
在计算机中是以字节为单位,每个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定,可以通过siz ...
- 大端和小端传输字节序
大端和小端 在计算机中是以字节为单位,每一个地址对应一个字节,一个字节8bit.在C中,除了8bit的char以外,还有16bit的short,32位的int,64位long,当然具体要由编译器决定, ...
- 大端和小端的判断及转换
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-en ...
- 大端和小端存储模式解析
一.大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一 ...
- 网络字节码、本地字节码(大端,小端)
大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的<格利佛游记>:Lilliput和Blefuscu这两个强国在过去的36个月中一直在 ...
- 大端模式小端模式详解(不懂你打我,略略~~)
大端模式小端模式详解(不懂你打我,略略~~) 先看概念 大端模式(Big-Endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作 ...
- 大端和小端的含义及判断代码
1.概述 在计算机系统中,数据都是以字节进行存储的,每个地址单元对应一个字节,每个字节都是8位(bit).但是C++除了char和bool之外,还有其它多字节类型.怎样存储多字节的数据就分为了大端和小 ...
- c语言 int大端转小端,C++将整型数据转换成大端或小端存储顺序
昨晚帮导师从指令中恢复图像的时候,导师要我转换成raw格式,也就是记录图像像素的二进制序列,然后反复强调让我注意大端小端.当时我也没在意,用ofstream的write方法一个个地写进去,发现有部分数 ...
最新文章
- 14 类编程题解法总结
- python如何调用cpp文件的接口函数_C++中嵌入Python调用
- 知其然,知其所以然:基于多任务学习的可解释推荐系统
- (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果...
- RocketMQ-初体验RocketMQ(04)_使用RocketMQ Console源码搭建RocketMQ Console与基本使用
- vivo android8公测,vivo 开启安卓P公测不限人数!这四款机型用户别错过了
- Python 为啥不建议使用 thread模块?
- postgres循环sql
- LAMP环境中如何重新部署一个Yii2.0 web项目
- 电脑模拟器哪个好_电脑系统杀毒软件哪个好测评
- ArcCatalog中将SQLServer中的空间数据导入到Oracle库中
- Cesium基础使用介绍
- 海康威视设备发现sdp原理
- 初中数学最全几何模型_初中数学几何模型秘籍.pdf
- HFS 2.3x 远程命令执行(抓鸡黑客末日)
- 目标检测的数据集制作一般流程(Pascal VOC标准格式)
- 苹果订阅的升级、降级、同级转换
- 小程序如何实现下拉选项操作
- 十九、顺序查找法和折半查找法
- mysql string agg_如何从string_agg()中以正确的顺序得到结果
热门文章
- 洞见(1): zig 编程语言
- SD-WAN网络加速,开通游戏快车道
- 167	The Sultan's Successors
- 现在学java好还是python好_县花一现的“现”是什么意思?
- 蜜蜂问题- 斐波那契数列
- source tree ui操作对应的git命令
- 通往架构师之路系列之Java设计模式(二)工厂方法模式
- python等于号怎么输入_python 中不等于怎么表示
- 【RT-Thread Smart】ART-Pi Smart 开发板开箱及爱之初次体验
- 使用Android Studio将开源库发布到Jcenter中央库