技术标签: C语言 嵌入式
Most Significant Bit, Last(Least) Significant Bit
最高有效位(MSB)
指二进制中最高值的比特。在16比特的数字音频中,其第1个比特便对16bit的字的数值有最大的影响。例如,在十进制的15,389这一数字中,相当于万数那1行(1)的数字便对数值的影响最大。比较与之相反的“最低有效位”(LSB)。
MSB高位前导,LSB低位前导。
谈到字节序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。那么究竟什么是big endian,什么又是little endian呢?
其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。
用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:
Big Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。而little endian,!@#$%^&*,见鬼去吧 -_-|||
为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而J***A编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的J***A程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了J***A程序,由于J***A采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给J***A程序之前有必要进行字节序的转换工作。
无独有偶,所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。ANSI C中提供了下面四个转换字节序的宏。
·BE和LE一文的补完
我在8月9号的《Big Endian和Little Endian》一文中谈了字节序的问题,原文见上面的超级链接。可是有朋友仍然会问,CPU存储一个字节的数据时其字节内的8个比特之间的顺序是否也有big endian和little endian之分?或者说是否有比特序的不同?
实际上,这个比特序是同样存在的。下面以数字0xB4(10110100)用图加以说明。
Big Endian
msb lsb
---------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Little Endian
lsb msb
---------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
实际上,由于CPU存储数据操作的最小单位是一个字节,其内部的比特序是什么样对我们的程序来说是一个黑盒子。也就是说,你给我一个指向0xB4这个数的指针,对于big endian方式的CPU来说,它是从左往右依次读取这个数的8个比特;而对于little endian方式的CPU来说,则正好相反,是从右往左依次读取这个数的8个比特。而我们的程序通过这个指针访问后得到的数就是0xB4,字节内部的比特序对于程序来说是不可见的,其实这点对于单机上的字节序来说也是一样的。
那可能有人又会问,如果是网络传输呢?会不会出问题?是不是也要通过什么函数转换一下比特序?嗯,这个问题提得很好。假设little endian方式的CPU要传给big endian方式CPU一个字节的话,其本身在传输之前会在本地就读出这个8比特的数,然后再按照网络字节序的顺序来传输这8个比特,这样的话到了接收端不会出现任何问题。而假如要传输一个32比特的数的话,由于这个数在littel endian方存储时占了4个字节,而网络传输是以字节为单位进行的,little endian方的CPU读出第一个字节后发送,实际上这个字节是原数的LSB,到了接收方反倒成了MSB从而发生混乱。
1.ubuntu 默认面板恢复命令昨天裝了Ubuntu,折腾来折腾去,面板不见了,不是默认的布局了,添加面板不是解決办法。Google 了下,解决办法如下:打开终端,终端窗口打开之后,立即在提示符后面输入下列命令:gconftool --recursive-unset /apps/panel(注意:每个斜杠 “/” 后面没有空格)接下来输入下列命令:rm
当使用explain查看sql语句 , 出现Using filesort时 , 一定要检查下order by字段这时候是使用了外部文件排序 , 并且看到rows列是全部数据时 ,速度会比较慢给这样的字段增加索引 , 可以解决这个问题没加索引的时候...
本文使用的laravel框架是4.0版本首先说一下什么是异步操作,一般什么情况下需要使用异步操作。(这里我们使用简单通俗的表述,大致明白其意思,非官方定义。可以自己进一步上网查阅更加详细的描述)。在我的理解,异步操作是和同步操作相对应的一个概念,异步操作不需要马上知道操作的结果,当前操作不会影响下一步操作。使用异步操作一般具备两个特点:一是并不需要马上知道结果;二是比较费时,为了提高操作的流畅性而将
近日有win10系统用户想要将一些文件存储在usb驱动器中,但是却遇到了提示该驱动器不是有效备份位置,导致备份失败,遇到这样的问题该如何处理呢,本文就给大家带来win10电脑备份数据提示该驱动器不是有效备份位置的具体解决方法。此问题背后的原因是Windows无法将USB驱动器识别为有效的备份位置,因为早期它们不足以存储系统映像。以下解决方案可能有助于解决驱动器不是有效的备份位置错误:使用第三方工具...
get 和post把get改成post提交
简单的纹理贴图实例,来学习OpenGL的功能//main.h#if !defined_MAIN_H_#define _MAIN_H_#include#define WIDTH 64#define HEIGHT 64GLubyte Image[WIDTH][HEIGHT][4];static GLuint texName;GLint WinWidth;GLint Win
1. 简述 在 Windows2000/xp 下,安装 VS2005, QT 4.5.2 ;并在 VS2005上建立 QT 的集成开发环境, 利用 VS2005 开发环境开发,调试 QT 程序;2. 所需程序 VS2005 // VS2005 的安装程序; qt-win-opensource-src-4.5.2.zi
由于项目需要,需要了解一下电路的设计,因此特地使用Multisim软件,绘制了一个简单的电路图。如下:一开始在绘制的时候,感觉找那些元器件,挺麻烦的,不懂元器件不知道它的英语文字。还有在选择7段显示管的时候,一开始我使用阳性的显像管(anode),没有反应,后来换成阴极的显像管(cathode),结果就可以了。 以后还是要多学些电子方面的知识了。
自制多分类cityscapes格式数据集用于HRNet网络进行语义分割!说在前面查看cityscapes格式数据集制作HRNet网络的理解总结如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入!说在前面语义分割对图像进行分割是基于像素点对其进行分类的,所以我今天要说的分割
LaTex是一个强大的论文排版系统,效果非常美观,告别word使用LaTex排版是科研人员的必备技能。由于博主使用的是Mac OS,所以LaTex论文排版教程主要基于MacTex+TexStdio;Windows用户也不必担心,可以安装TexLive,具体安装和配置过程可以自行百度。出了环境不同之外,其余用法和命令和系统无关,是通用的。在本篇博客中我们将介绍一下Mac OS下LaTex的安装。...
20世纪80年代,欧美提出了第五代计算机---智能计算机研制计划。第五代计算机具备人工智能,能像人一样思维,并且运算速度极快。同时,多媒体技术得到广泛应用,使人们能用语音,图像,视频等更自然的方式与计算机进行信息交互。 同时现在还提出了利用蛋白质分子制造出基因芯片,研制生物计算机(也称分子计算机、基因计算机),已成为当今计算机技术的最前沿。语音识别?图像识别?视频处理?...
程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 5 分钟。来自:鄙人薛某 作者:很懒的程序员上周四午休时分,我正在工位上小憩,睡梦中仿佛看到了自己拿着李白在荣耀...