首页 > 其他分享 >随想录(字节序和位序)

随想录(字节序和位序)

时间:2022-11-23 12:00:57浏览次数:56  
标签:小端 字节 位序 随想录 packet u32 大端 cpu u8

 

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


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_ENDIAN
u8 a:3;
u8 b:3;
u8 c:2;
#endif

#ifdef BIG_ENDIAN

u8 c:2;
u8 b:3;
u8 a:3;
#endif

};


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

struct word {

#ifdef LITTLE_ENDIAN
u32 a:4;
u32 b:8;
u32 c:4;
u32 d:8;
u32 e:8;
#endif

#ifdef BIG_ENDIAN

u32 e:8;
u32 d:8
u32 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的转换的。只要灵活运用这些实例,就可以判析字节序和位序的关系了。



标签:小端,字节,位序,随想录,packet,u32,大端,cpu,u8
From: https://blog.51cto.com/feixiaoxing/5880830

相关文章

  • 随想录(软件调试)
       对于很多程序员朋友来说,编写代码要比调试代码快乐的多。似乎创造软件比维护软件更能给人带来成就感。然而,在企业里面维护前人留下的代码也是工作中不可缺少的一项内......
  • 随想录(写给自己的C++编程规范)
       对于我这样一个C语言的程序员来说,编写C++的机会其实不太多。但是我还是比较喜欢写C++语言,原因主要有几个方面:(1)自己学C++语言的时间比较长了,也比较了解,如果从大一的时......
  • 随想录(png的读取和显示)
       之前在阅读FTK代码的时候,发现工程本身用到了PNGLIB的代码。虽然网上关于pnglib的描述文件很多,但是真正好用、可以用的却没有多少。所以,为了学习的方便,我自己做了一个......
  • 随想录(公司程序员的九层楼)
        就IT公司而言,都希望自己的程序员在单位时间内生产出效率最高的代码。但是,不同的人有不同的开发效率。至于说效率之间的差别究竟有多少,还真不得而知。这里写了几个......
  • 随想录(软件中的bug)
       软件由于其特殊性,始终和bug紧密地联系在一起。没有bug的软件是不存在的。为什么这么说呢?我们知道,软件是由很多人完成的,不同的人完成代码的水平是不一样的,一旦沟通不......
  • 随想录(锁的来由和使用)
       对于开发系统级别软件的朋友来说,无论你是主动的还是被动的,锁的应用都是少不了的。很多人用锁,可是却未必知道锁的前世今生,什么时候用锁,什么时候不用锁?该用什么样的锁?......
  • 随想录(编写用户侧定时器)
       定时器是我们在平时开发中经常使用到的工具,特别是在协议的编写上更是必不可少的组成部分。虽然系统本身给我们提供了定时器,但是有的时候,我们也想自己编写一个粗粒度......
  • 随想录(为什么循环队列具有先天的并行性)
       循环队列是很多人喜欢用的一种数据结构。本着先来先服务的特性,循环队列是一种十分简单、健壮的数据结构。不像链表、二叉树,如果使用不慎,就会造成很大的麻烦,但是在循......
  • 随想录(linux下的pv操作)
         关于pv操作部分的内容,其实算不上什么新的东西。但是它对于我们理解信号量、消息处理部分的工作还是有很大帮助的。之前我们给出了一个win32的处理方案,但是实现的......
  • 随想录(写给那些学校不是985、211的同学们)
       每年的6、7月份都是一年一度的毕业季。按照某些新闻机构的统计数字来说,现在每一年毕业的人数达到了600万之多。然而随着社会经济的放缓、贫富差距的拉开,找工作变得越......