【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

最近家里面没有了网络,所以写文章的次数也少了。所以,暂时只能利用一下公司加班的时间,补充一下最近的心得。曾经有一段时间,自己对字节序和位序不是很清楚。所以,前几天找了几本书,同时做了一些练习,算是把这个问题弄清除了。


a)字节序

所谓字节序,其实就是指cpu的大小端。大家平常接触到的cpu一般都是小端类型的,比如arm、x86、mips等等。大端的类型的cpu也有,如果有朋友是做通讯设备的,那么他所接触到的cpu一般就是powerpc,而powerpc一般都是大端类型的。当然,在cpu设计的时候,LITTLE ENDIAN还是BIG ENDIAN,其实都是可以灵活配置的,我说的也只是普通的情况。举例来说,

如果一个数据为0x12345678,那么对于大端cpu,它在ddr中的保存形式就是12 34 56 78。而对于小端的cpu来说,它的保存形式是 78 56 34 12。如果数据只是给自己用,不需要和外界交互,那么其实无所谓大端和小端。但是对于某些设备,这种情况却要分清楚一些。特别是自己的机器和外界设备交互的时候,势必会涉及到各种packet,而packet中也必然会涉及到各种control word。当然,如果不巧控制字是32位或者64位类型的,那么还是会涉及到大小端的问题。不同的packet在各个设备之间传输,甚至通过路由器传输到地球的另一端,这都是可能的。对于处理packet的设备,这中间肯定有大端cpu设备,也有小端cpu设备。我们可以假设packet都是按照小端类型存储的。所以,大家可以灵活地根据cpu类型作出调整。在linux系统上,有一个很灵活的macro,即le32_to_cpu帮助我们解决了这个问题。如果你是小端cpu,什么也不要做;然是如果你是大端cpu,那么就要做一些数据的调整了。

b) 位序

同样是packet报文,有的时候我们需要把一些控制字组成8位或者32位类型,首先,我们拿8位类型举例,

struct word {#ifdef LITTLE_ENDIANu8 a:3;u8 b:3;u8 c:2;
#endif#ifdef BIG_ENDIANu8 c:2;u8 b:3;u8 a:3;
#endif};

如果是u8类型,即数据是按照8位形式保存的,那么其实这样使用就可以了。字节序本身只对byte有意义,对于位序没什么影响。当然位序也和cpu有关,小端cpu保存数据是按照从小到大排列的,而大端数据是按照从大到小排列的。所以不管是大端cpu还是小端cpu,在ddr中这个数据的形式都是唯一的。但如果是32位数据呢,

struct word {#ifdef LITTLE_ENDIANu32 a:4;u32 b:8;u32 c:4;u32 d:8;u32 e:8;
#endif#ifdef BIG_ENDIANu32 e:8;u32 d:8u32 c:4;u32 b:8;u32 a:4;
#endif};

这个数据明显要比上面的数据复杂一下。但是大家只要记住基本的原则就可以了。那就是,大端cpu从大到小排列,而小端cpu是从小到大排列。所以,大家可以考虑一下,这个数据在小端cpu和大端cpu中分别是怎么排列的?我们可以4位、4位的来判断,如果是小端cpu,应该是这样的

b1、 a ||   c、 b2 ||   d2、 d1 ||  e2、 e1

大端cpu呢?

e2、 e1 || d2、 d1 || c、 b2 || b1、 a

不知道,大家看出什么差别来没?其实这两个数据除了字节序不同之外,在每一个byte中数据的相对位置都是一样的。所以在处理位序的时候,我们只需要在定义控制字的时候按照逆向排列数据,就可以得到符合cpu需要的数据了。当然,这个数据如果需要传输的话,以packet类型是小端为例,还是需要进行cpu_to_le32的转换的。只要灵活运用这些实例,就可以判析字节序和位序的关系了。

随想录(字节序和位序)相关推荐

  1. 大端模式字节序和位序以及操作

    2019独角兽企业重金招聘Python工程师标准>>> 字节序:先存高字节(高字节在低地址): 位序:先存高位(高位在低地址): 也就是与我们平时的书写习惯是一致的.例如:0x123 ...

  2. 位序、字节序、类型序

    计算机学科中的很多问题,都是因为概念的抽象模糊,导致理解上的不确定性,增加学习领悟的难度.对于计算机中数据存放次序的问题,很多教材或文章要么含糊其辞,要么凭空飞来结论,让人看的一头雾水.几经周折,结合 ...

  3. 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)

    本文首发于 2014-07-21 15:32:28 1. 引言 考虑下面的结构体定义: typedef struct{char c1;short s; char c2; int i; }T_FOO; ...

  4. 【转】刨根究底字符编码之九——字符编码方案的演变与字节序

    字符编码方案的演变与字节序 一.字符编码方案的演变 1. 根据前面的介绍,对于字符编码方案的演变,我们大致上可简单地划分为三个阶段: ① ASCII编码方案阶段 → ② ANSI编码方案阶段 → ③ ...

  5. 一文带你秒懂 字节序(byte order),比特序(bit order),位域(bit field)

    字节序,比特序,位域 前言 引出疑惑 字节序 比特序 网卡-比特的发送和接收顺序 大端序发送给小端序 小端序发送给大端序 位域 定义协议的万能公式 前言   不总结出来睡不着觉啊md,本来想着1点就能 ...

  6. 大小端(网络字节序)等概念

    1.大小端定义 大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中 小端存储模式:是指数据的低位字节序保存在内存的低地址中,而数据的高位字节序保存在内存的高 ...

  7. 一字节内的位序(bit)大端小端分析

    相信字节序.大端.小端的概念相关资料很多,大家都比较清楚了.这里说明下一字节内部位序(bit)的概念. 在计算机中底层一个存储单元是字节,因此你的指令寻址是不可能找到一字节内部的bit的,是无法指令寻 ...

  8. 飞腾CPU体系结构之字节序

    字节序 描述数值在内存中的每一个字节排列顺序. 举例说明,以一个32位4字节为例,数值0x1234_5678的小端字节序和大端字节序描述如下: 1. 小端字节序 字节 3 2 1 0 0x12 0x3 ...

  9. 位域 内存 字节序_JS操作内存?二进制数组了解一下

    二进制数组的由来 主要是为了提高浏览器与显卡之间的通信效率,由二进制数据代替传统的文本. 二进制数组主要有三个对象: ArrayBuffer TypedArray DataView ArrayBuff ...

最新文章

  1. MySQL学习总结(三)索引
  2. 一个老鸟发的公司内部整理的 Android 学习路线图 Markdown 版本
  3. html怎么设置z值,css z-index属性怎么用
  4. git revert和reset区别
  5. 银行贷款(洛谷P1163题题解,Java语言描述)
  6. Java中反射的理解
  7. MATLAB带通滤波器开始端和结尾端数据异常(解决的小技巧)
  8. selenium 区域截图
  9. Gradient Descent
  10. 通过Gazebo仿真学TurtleBot3(四)——简单的/cmd_vel控制
  11. 服务端微信小程序支付/退款详解
  12. DEAP Example: One Max Problem
  13. win7系统计算机无最小化,技术员解惑win7系统任务栏不显示最小化窗口的修复办法...
  14. 用于 LLM 应用开发的 LangChain 中文版
  15. Oracle 12warehouse,warehouse提供的免费oracle学习视频
  16. Python爬虫—京东在线抢购
  17. 思科否认与华为中兴事件有关
  18. .aspx文件和.aspx.cs 、 .designer.aspx.cs关联
  19. Hbase简介(上篇)
  20. 【DotA2玩家心得】激活显示FPS/PING 开启国服 开启右键反补

热门文章

  1. MySql查询随机几条数据
  2. tomcat PermGen space 不足的解决方法
  3. Week 1 Team Homework #3 from Z.XML-软件工程在北航
  4. android系统如何自适应屏幕大小
  5. hdu 1542 Atlantis (线段树+扫描线)
  6. WAP 的组成及主要特点
  7. 节约:我们不应忘记的美德
  8. bugku_web_INSERT INTO 注入
  9. codeforces test #12 C. Subsequences 树状数组统计
  10. 全面深入介绍C++字符串:string类