字节序:Big Endian 和 Little Endian

蓝牙开发那些事(4)——关于流控 5.4 关于流控 上一章,留了个尾巴。 先来个数据包格式的图,上图中,packet header和payload header中间都出现了流控(FLOW)位。 我们之间讲HCI命令的时候,提到了HCI transport层的流控。 其实HCI上层的L2CAP层,也提供了流控服务的。 是不是概念很搞? 接下来我们具体讲一下流控。 其实只要有传输就会有流控,在我们蓝牙的体系里,数据的流动有两个关键位置,一是介于controller和host之间的HCI,这个通过hci transport层的. 阅读详情

最近碰到了node.js中的buf.readUInt16LE(offset[, noAssert])方法:
        根据指定的偏移量,使用特殊的 endian 字节序格式读取一个无符号 16 位整数。若参数 noAssert 为 true 将不会验证 offset 偏移量参数。 这意味着 offset 可能会超出 buffer 的末尾。默认是 false。

           搜了下字节序这个概念:

转自:https://blog.youkuaiyun.com/lisonglisonglisong/article/details/45421091

 

一、字节序


字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序。

在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如:如果C/C++中的一个int型变量 a 的起始地址是&a = 0x100,那么 a 的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。

根据整数 a 在连续的 4 byte 内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类。 然后就牵涉出两大CPU派系:

Motorola 6800,PowerPC 970,SPARC(除V9外)等处理器采用 Big Endian方式存储数据;

x86系列,VAX,PDP-11等处理器采用Little Endian方式存储数据。

另外,还有一些处理器像ARM, DEC Alpha的字节序是可配置的。

 

二、大端与小端


那么,到底什么是大端,什么是小端? 如下图:

               
 
我相信上面的图已经够直观了。也就是说:

Big Endian 是指低地址端 存放 高位字节。
Little Endian 是指低地址端 存放 低位字节。
各自的优势:

Big Endian:符号位的判定固定为第一个字节,容易判断正负。
Little Endian:长度为1,2,4字节的数,排列方式都是一样的,数据类型转换非常方便。


三、为什么要注意字节序


如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。

但是,如果你的程序要跟别人的程序产生交互呢? 比如,当一个 C/C++ 的程序要与一个 Java 程序交互时:

C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而现在比较普遍的 x86 处理器是 Little Endian

JAVA编写的程序则唯一采用 Big Endian 方式来存储数据

试想,如果你的C/C++程序将变量 a = 0x12345678 的首地址传递给了Java程序,由于Java采取 Big Endian 方式存储数据,很自然的它会将你的数据翻译为 0x78563412。显然,问题就出现了!!!

另外,网络传输一般采用 Big Endian,也被称之为网络字节序,或网络序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。

四、判断机器的字节序
由于 C/C++ 存储数据时的字节序依赖所在平台的CPU,所以我们可以通过C/C++程序判定机器的端序:

void Endianness()
{
    int a = 0x12345678;
    if( *((char*)&a) == 0x12)
        cout << "Big Endian" << endl;
    else
        cout << "Little Endian" << endl;
}


五、网络序和主机序


网络字节序:TCP/IP各层协议将字节序定义为 Big Endian,因此TCP/IP协议中使用的字节序是大端序。

主机字节序:整数在内存中存储的顺序,现在 Little Endian 比较普遍。(不同的 CPU 有不同的字节序)

在进行网络通信时 通常需要调用相应的函数进行主机序和网络序的转换。Berkeley socket API 定义了一组转换函数,用于16和32bit整数在网络序和本机字节序之间的转换。htonl,htons用于本机序转换到网络序;ntohl,ntohs用于网络序转换到本机序。
--------------------- 
 

深度篇——图像处理的一些方法(一) 关于 图像处理的三个层次 与 selective search 返回主目录 返回 图像处理的一些方法 目录 下一章:深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 目录内容 深度篇——图像处理的一些方法(一)关于图像处理的三个层次 与 selective search 深度篇——图像处理的一些方法(二)细说性能评估 IOU和 GIOU 深度篇——图像处理的一些方法(三)细说 HOG特征与bag-o... 阅读详情

相关推荐

第一届“龙信杯”电子数据取证竞赛Writeup

第一届“龙信杯”电子数据取证竞赛Writeup

toto的博客 1万+

buf.readUInt16BE()

buf.readUInt16BE(offset[, noAssert]) buf.readUInt16LE(offset[, noAssert]) offset {Number} 0 <= offset <= buf.length - 2 noAssert {Boolean} 默认:false 返回:{Number} 从该 Buffer 指定的带有特定尾数格式(readUInt16...

weixin_30692143的博客 708

NUS-WIDE-10K数据集制作

NUS-WIDE是一个多标签数据集,数据集中一共包含26,9648个样本,可以分为81个类。最近在做跨模态检索项目,发现有很多论文里面都用到了NUS-WIDE-10K数据集,但是在网上也没有搜索到相关的数据集下载链接或者是数据集制作代码,所以自己动手写了一个NUS-WIDE-10K数据集的制作代码。 1.介绍 我在网上找到的最早关于NUS-WIDE-10K数据集描述的论文是:Cross-modal Retrieval with Correspondence Autoencoder。描述如下:作者选择了N

weixin_44012382的博客 4201

Node.js开发指南之三:核心模块介绍续

1 buffer buffer为Node提供的处理二进制字节流的工具,原始数据存在在buffer对象里,当需要与string相互转换时,需要指定string的编码。目前Node支持下列编码:ascii,utf8,utf16le,base64,hex。binary在未来可能会被Node抛弃。 下面列举Buffer类的方法和属性 new Buffer(size)  new Buffer(arra

zzulp的专栏 3826

Android蓝牙Mesh组网实战:从零搭建智能灯光控制系统(附完整代码)

本文详细介绍了基于Android平台开发蓝牙Mesh智能灯光控制系统的完整实战流程。从环境搭建、核心概念解析,到设备扫描配网、网络初始化、模型配置与消息通信,提供了完整的代码实现和调试技巧。重点讲解了如何使用开源Mesh库实现设备发现、分组控制、场景管理等核心功能,并分享了实际项目中遇到的典型问题与解决方案。

weixin_29174013的博客 660

Altium Designer 16来自原理图/PCB的各种报错 (持续更新):

NO1.Nets with only one pin: 根本原因: 在BGA的原理图绘制时,我一般习惯拉出该元件的所有IO的网络,这方便利于我开发其他款板卡。同样也会因为不同板卡的需求不同而造成有些IO并没有使用到,也就是整个原理图中only one pin。 解决方案: 鼠标右键工程文件>工程参数>下图圈中的选项将“错误”更改为“警告/不报告” ...

优快云@猿谷攻城狮 1万+

node buffer

缓冲器类 稳定性: 3 - 稳定 纯粹的JavaScript语言对处理Unicode非常友好,但却对二进制数据束手无策。在处理TCP流或文件系统时,不得不操作字节流。Node拥有操作、创建以及消耗字节流等的一系列策略。 原始数据储存在缓冲器类的实例中。缓冲区像是一个整型数组,只不过是在V8堆外分配的一个原始内存块。 缓冲区是不能改变大小的。 缓冲器类是全局对象,必须使用r

服务器端攻城师 1300

多重共线性问题 -- 岭回归方法

概述 本篇博客分为三大部分,线性模型、多重共线性问题和岭回归。其中,线性模型中介绍了线性模型定义和普通最小二乘法对线性模型的拟合。第二部分,借由1987-2007年的人口、消费和科技对碳排放的影响的数据来说明多重共线性问题(包括如何从定性和定量两个方面判断多重共线性问题)和多重共线性问题对普通最小二乘估计的影响。第三部分,使用岭回归对第二部分中的多重共线性问题进行拟合,并基于R2R^2R2决定系数...

楚江客的记录 1万+

蓝牙协议栈(五、(配置文件/剖面))

在下文中,我们将解释如何在BTstack中使用各种蓝牙配置文件。 GAP - 通用访问配置文件:经典 GAP配置文件定义设备如何相互查找并为其他配置文件建立安全连接。如前所述,GAP功能在和之间分配。请检查两者。 变得可被发现 必须将远程未连接的蓝牙设备设置为“可发现”,以便被执行查询扫描的设备看到。要变为可发现,应用程序可以使用输入参数1调用gap_discoverable_contr...

happygrilclh的博客 1977

材料带隙预测(图神经网络)(⭐⭐)—— 用晶体图网络预测钙钛矿材料的能带隙,加速光伏材料筛选。技术栈:CGCNN、MEGNet、Materials Project数据集

钙钛矿太阳能电池以其高效率、低成本的优势迅速崛起,但传统“试错法”材料筛选效率极低,严重制约了光伏技术的迭代速度。近年来,基于图神经网络的材料带隙预测方法,特别是晶体图神经网络(CGCNN)和材料图网络(MEGNet),为这一问题提供了革命性的解决方案。本文系统梳理了材料带隙预测从传统计算到深度学习的演进历程,深入剖析了CGCNN与MEGNet的架构设计、数学原理及创新机制,详细阐述了Materials Project数据集的构建、特征工程与处理策略。

2201_76125393的博客 48

装上大模型翅膀,程序员入职新公司如何快速上手代码(老员工如何选择大模型编程如虎添翼)

入职新公司,尤其是行业知识不懂的,面对前人堆积的屎山代码,各种文档又缺少的,有些技术自己又不懂的,如何快速上手代码,特别是借助AI大模型事半功倍的上手项目代码。进入新公司,我做的第一件事就是收集情报。我主动向同事们索要项目的相关资料,包括项目介绍文档、功能说明文档和业务流程图等。通过仔细阅读这些资料,可以对项目的背景和架构有了初步的了解。同时要逮住机会就向同事们请教项目的迭代历程和技术选型背后的考量。有时他们三言二语,可以为自己节省很多探索时间。在了解了项目的基本情况后,可以开始深入探究项目的业务流程。

大模型大数据攻城狮的专栏 1132

[J2SE]两种字节序:Big Endian和Little Endian

<br />今天搜到的一个知识,分享 一下。<br /> <br />1.故事的起源<br /><br />       “endian”这个词出自《格列佛游记》 。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。<br />       我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”(我宁可称为“大字节序”与“小

Sodino的专栏 2903

LeRobot 入门教程(十六)Isaac Lab LeIsaac 叠衣服、夹橙子仿真环境

LeRobotEnvHub现已支持通过LeIsaac进行机器人模仿学习,提供摘橙子、搬立方体等日常任务仿真环境。用户可通过HuggingFace共享环境,使用一行代码加载任务,支持随机动作测试和远程操控。系统提供云端仿真方案,无需本地GPU即可运行。当前支持4种任务环境,通过make_env函数切换,其中折叠布料任务需先调用initialize()函数。该平台集成了数据采集、转换和训练全流程,为机器人学习提供便捷工具链。

2506_90492529的博客 1484

什么是Little Endian和Big Endian?(Endianness:字节序、端序、尾序)

当数据在网络传输或磁盘存储时,都是以字节为单位,而每字节占8bit;那多字节数据如int,以什么顺序读写字节、如何组装成最终输出的数据呢?

reading-conference-writing 8616

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

little endian c语言,c语言那些细节之little-endian和big-endian

知道大小端,但是都没有整理下,只知道网络要用到big-endian,也就是大端模式。在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Bi...

weixin_35120567的博客 358

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言那些细节之little-endian和big-endian

知道大小端,但是都没有整理下,只知道网络要用到big-endian,也就是大端模式。 在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机通信领域中一个很重要的问题,即通信双方交流的信息单元(比特、字节、字、双字等等)应该以什么样的顺序进行传送。如果不达成一致的规则,通信双方将无法进行正确的编/译码从而导致通信失败。 目前在各种体系的计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian。 以unsigned int value = 0x123

Shanlu_的博客 787

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于字节序的问题

字节序分为两类:Big-Endian和Little-Endian。(1) Little-Endian: 低位字节存放在内存的低地址端,高位字节存放在内存的高地址端。INTEL X86 CPU采用的正是此字节序。(2) Big-Endian   : 高位字节存放在内存的低地址端,低位字节存放在内存的高地址端。MOTOROLA POWER PC CPU(以及SUN RISC架构的SPARC

oygy的专栏 633

Big-endian & Little-endian

Suppose that each unit is 8-bit in the memory, and there exists data 0x1234abcd stored from 0x00000000. Byte orders of Little-endian and Big-endian are as below: In Little-endian mode, the most s

richardzsw的专栏 843

网络字节序与主机字节序

不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即...

weixin_34029949的博客 139

什么是网络字节序,主机字节序

不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序 最常见的有两种 1. Little endian:将低序字节存储在低地址 2. Big endian:将高序字节存储在低地址【网络字节】 【用函数判断系统是Big Endian还是Little Endian】 bool IsBig_Endian() //如果字节序为big-endian,返回t

xiuzhentianting的博客 732

字符编码:ASCII、Unicode、UTF-8和字节序

ASCII码 在计算机中,所有的数据在存储和运算时都要使用二进制表示。而具体用哪些二进制数表示哪个符号,每个人都可以制定自己的一套规则,这就叫编码。 为了让大家互相通信而不造成混乱,就需要使用相同的一套编码规则。 ASCII码(美国信息交换标准代码)就是一套通用的标准编码,主要用于表示英语和其它西欧语言。 ASCII码使用一个字节表示一个字符,一个字节(8位二进制)可以表示256个不同的符号,从 0000 0000 到 1111 1111。如ASCII码: 二进制...

Never Limit 1295

CPU大端模式和小端模式详解,介绍如何通过程序验证计算机的大小端

大于一个字节类型的数据在内存中的存放顺序,在计算机中通常采用的字节存储机制主要有两种:Big-Endian和Little-Endian。 a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 c) 网络字节序:TCP/IP各层协议将字节序定义为Big-Endian...

weixin_42974146的博客 418

常见主机字节序

常见主机字节序   1. Little endian:将低序字节存储在起始地址   2. Big endian:将高序字节存储在起始地址   LE little-endian   最符合人的思维的字节序   地址低位存储值的低位   地址高位存储值的高位   怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说   低位值小,就应该放在内存地址小的地方,也即内存地址低位

hzgdiyer的专栏 706
上一篇: JSON.parse()与JSON.stringify()的区别
下一篇: javascript中call()、apply()、bind()的用法终于理解
acoolgiser
博客等级 码龄11年 179粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值