大小端模式与位字段小总结

车载测试新人必看:从一条真实的CAN报文(0x0CFF7C03)反推通信协议,搞懂帧ID和数据含义 本文详细解析了车载测试中CAN报文(如0x0CFF7C03)的逆向工程方法,从帧ID结构拆解到数据字节的物理意义转换,帮助新人快速掌握CAN通信协议解析技巧。通过实战案例和工具代码,提升车载测试工程师的报文分析能力。 阅读详情
 最近看代码,突然看到以下的,当时就震惊了,除了MFC的一些,还是第一次看到类里定义牵扯到宏的。   加上以前对大小端和位字段的接触都很少,只是看到,然后粗看,飘过那种,想不到还真遇到了,于是总结下。
class DownlinkControlField {

public:
#if defined(__BIG_ENDIAN_BITFIELD)
    unsigned short res1:2;
    unsigned short ack:2;
    unsigned short res2:2;
    unsigned short dir:1;
    unsigned short sof:1;
    unsigned short mf:1;
    unsigned short packet_type:2;
    unsigned short transparent:1;
#elif defined (__LITTLE_ENDIAN_BITFIELD)
    unsigned short ack:2;
    unsigned short res1:2;
    unsigned short transparent:1;
    unsigned short packet_type:2;
    unsigned short mf:1;
    unsigned short sof:1;
    unsigned short dir:1;
    unsigned short res2:2;
#endif
};

     

一、大小端

        简而言之,大端是高对低,小端是高对高。后来一搜,说是大小端,居然是有个故事的。格列佛游记里一个故事,小人国的领导下了一道命令,规定人民在剥鸡蛋时必须从小的一段(little-end)开始。这规定惹恼了一群觉得应该从大端(big-end)开始剥的人,后来演变成纷争。支持little-end的人称为little-endian,支持big-end的人称为bid-endian。(来自http://bbs.c114.net/viewthread.php?tid=376162)

        这样就好理解了,大端就是先放高位,放在低地址,小端就是先放小的,放在低地址。其实老外还是蛮有意思的。关于大小端讲的蛮不错的一篇文章http://my.oschina.net/alphajay/blog/5478?from=rss

大小端定义的头文件,在楼主ubuntu下为/usr/include/linux/typeoders目录下,一个little_endian.h一个big_endian.h;在楼主的vc6头文件中还有一个,C:\Program Files\Microsoft Visual Studio\VC98\Include目录下,endian.h。编译记得加上-D选项,如-D__LITTLE_ENDIAN_BITFIELD

有时候面试题会考到大小端的判断。应用到union的特性:union存储时,所有成员共用一个存储空间;union的存放顺序从低地址开始。于是如果判断cpu是大小端的c程序如下:       

 /*return 1 : little-endian, return 0:big-endian*/
int checkCPUendian(){
union {
unsigned int a;
unsigned char b;            
}c;
c.a = 1;
return (c.b == 1);      

}  
二、位字段

在存储空间宝贵的情况下,有时候需要将多个对象保存在一个机器字中。通常的方法是定义一个与相关位的位置对应的屏蔽码集合,如

#define  KEYWORD 01
#define  EXTERNAL 02
#define  STATIC      04

        这样,访问这些位就变味了移位运算、屏蔽运算以及补码运算等。尽管这方法简单可行,不过C语言还提供了另一种可替代的方法,来直接定义和访问一个字中的位字段的能力,不需要按位逻辑运算。       

struct bytedata
   {
         unsigned a:2;   /*位段a,占2位*/
         unsigned:6;     /*无名位段,占6位,但不能访问*/
         unsigned:0;     /*无名位段,占0位,表下一位段从下一字边界开始*/
         unsigned b:10; /*位段b,占10位*/
         int i;               /*成员i,从下一字边界开始*/
    } data;
对于位字段,需要注意以下:

1)一个字段必须存储在同一存储单元(word)中,不能跨越2个单元。如果单元空间不够,则剩余空间不用,从下月单元开始存放。

2)字段的所有属性几乎都有具体实现有关(所以才有如上的大小端下不同 的情况)

3)特殊宽度0可以用来强制在下一个字边界上对齐

4)无名字段(只有一个冒号和宽度)起填充作用(感觉像哑元素?)

5)字段不是数组,且没有地址,所以不能用&符号

6)字段可以仅仅声明为int,为方便移植,需要显式声明该int为signed还是unsigned类型。

7) 位段名不是变量名,比如首先int i:3,再int j:5,并不是在2个单独int中,所以在计算sizeof结构体的时候注意下

以前总觉得好多面试题钻的方向挺诡异的,现在才发现,的确是应用到了一些工程的实践啊,只是敲点小代码玩,的确没这个需求

参考网址:http://www.cnblogs.com/xiaoliyu/archive/2008/11/18/1335711.html

告别数据丢失!深入Aurora IP核NFC流控:从帧格式解析到仿真验证全流程 本文深入解析Aurora IP核NFC流控机制,从协议原理到实战验证全流程。详细对比NFC与UFC的差异,解析NFC帧格式的二进制设计,并构建仿真验证平台进行状态机设计和时序验证。通过实战案例展示如何避免数据丢失,提升FPGA高速数据传输的可靠性。 阅读详情

相关推荐

从B0构造到完整密文:一个Python示例带你彻底搞懂CCM加密流程

本文通过Python示例详细解析了CCM加密流程,从B0构造到完整密文生成,涵盖CBC-MAC计算和CTR模式加密。特别针对密码算法实现中的常见陷阱,如字节序处理和填充规则,提供了实用解决方案,适合物联网安全通信等需要同时保证机密性和完整性的场景。

weixin_29325007的博客 253

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

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

reading-conference-writing 8606

Kernel: 大小端;__LITTLE_ENDIAN、__LITTLE_ENDIAN_BITFIELD

其实是和平台相关的一个定义:arch/x86/include/uapi/asm/byteorder.h这个文件里有定义使用little_endian.h这个文件里定义相应的转换宏,inline函数。很多网络,接口相关的结构体都需要下面两个宏来定义结构体成员的顺序。1234。

mzhan017的博客 728

struct iphdr中的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD

__LITTLE_ENDIAN_BITFIELD表示小端序,__BIG_ENDIAN_BITFIELD表示大端序。 /usr/include/linux/ip.h中有一段代码定义了ip首部的结构体,如下: struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (_

immiao的专栏 4194

Python之adafruit-circuitpython-register-spi包语法、参数和实际应用案例

adafruit-circuitpython-register-spi 是 Adafruit 推出的 CircuitPython 库,提供了一组便捷的类和方法,用于简化通过 SPI(Serial Peripheral Interface)总线与硬件设备寄存器进行交互的过程。

王国平的博客 727

基于CY7C68013A芯片的USB2.0设计

基于FPGA的USB2.0读写控制项目简介CY7C68013A芯片介绍CY7C68013A芯片读写时序控制CY7C68013A芯片读写代码USB2.0的测试结果结束语 项目简介 我们前面已经写过了USB3.0的FPGA实现,所用到的芯片是FX600Q芯片,这次我们讲解USB2.0的FPGA代码的编写。我们用到的芯片是Cypress厂家的Cy7C68013A,该款芯片在市场上的应用率极广,我们这里不...

zhangningning1996的博客 1万+

Linux中iphdr、tcphdr结构体的__LITTLE_ENDIAN_BITFIELD和__BIG_ENDIAN_BITFIELD

代码 在/usr/include/uapi/linux/ip.h和/usr/include/uapi/linux/tcp.h中分别有如下代码定义了ip以及tcp头部 iphdr: struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4; #else #error "Pleas

weixin_45144044的博客 1729

双足步行机器人的ZMP与CoP检测

静态步行与动态步行   机器人步态分为静态步行和动态步行。当机器人做静态步行运动时,身体的各个部分运动速度很小,机器人的整体稳定性较易控制。静态步行稳定性采用机器人的重心地面投影点(Center of Gravity,简称CoG)作为稳定性标准,这种判定方法适用于运动较为缓慢的情况。如果机器人采用的是一种高速运动的步行方式,则称之为动态步行。当机器人进行动态步行时,其重心的位置和加速度的大小时...

weixin_34112208的博客 5906

计算机存储的大小端模式解析

http://blog.youkuaiyun.com/hackbuteer1/article/details/7722667 原作者文章链接,写得很好,没必要再重新分析了,看这个就够了。一般在《计算机组成原理》,或者《微机原理》,或者《汇编语言》等课程中也会有介绍,不过没有这么详细透彻罢了。红色笔记是我的注解。 -----------------------------------------------...

weixin_34005042的博客 178

智能车图像处理5-入门级分析4 ---环岛的状态机与补线

PS :入门级文章适合新手,如果已经有基础可以去看进阶篇文章。

taiyuezyh的博客 8218

倍福EL6002实现RS232自由口通信,以称重模块RS232数据接收为例

RS-232是美国电子工业联盟制定的串行数据通信接口标准,原始编号全称是EIA-RS-232(简称RS232),它被广泛用于DCE(Data Communication Equipment ) 和 DTE(Data Terminal Equipment) 之间的连接。最早的台式电脑都会保留9针的232接口,用于串口通信,目前基本被USB接口取代。CTS是对请求发送RTS信号的响应,当DCE已经准备好接收数据时,该信号有效(ON),通知DTE可用使用TXD发送数据了。弄完了,再将CTS设置为1,让A发数据。

weixin_41883890的博客 1724

linux内核 大小端,大小端 位域

针对内核IP头version 和 ihl在大小端异位的一些介绍:version先定义的,应该在高位啊,即most significant 4 bits。可以这样来解释,1)从道理上来说,little endian中的位应该这样排列:01234567即排在前面的是低位。因此,先分配least significant bits2)而在Big endian中,位应该这样排列:76543210即排在前面的...

weixin_35721520的博客 241

【C++/嵌入式梳理】bootloader

【C++/嵌入式笔试面试八股】bootloader

Hi 1207

读书笔记:大小端模式对位域的影响

一、位域 有些信息在存储时不占用一个完整的字节,而只需要占用几个甚至一个二进制位。为节省存储空间,并使处理简便,C语言提供了一种数据结构,成为”位域“或”位段“。C与C++允许指定占用特定位数的结构成员。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数,且可以使用没有名称的字段来提供间距。每个成员都被成为位字段。下面是一个例子。 struct reg{ u

Rainloving的专栏 3887

详解账务核心,从入门到精通

本文系统阐述了账务体系的设计原理与实现方法,围绕支付交易的基础设施——账务系统展开深入探讨。文章首先从账务实现原理出发,强调从客户场景中抽象能力的重要性,详细解析了账务总架构及其与外围系统的协同关系。随后重点剖析了账户子系统的设计,包括账户生态、主体管理、结构设计等核心要素,并针对热点账户问题提出了多种创新解决方案。此外,文章还深入探讨了会计日切原理、营销类账务处理等专业领域,最后以支付机构场景为例,全面解析了清结算业务的账务实现模型。全文通过理论结合实践的方式,为构建高效、可靠的账务系统提供了系统性的方法

银行信息系统应用架构详解 525

【100%通过率】华为OD机试真题 Python 实现【高矮个子排队】【2023 Q2 | 100分】

我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺序排列,每一个“高”位置的小朋友要比相邻的位置高或者相等;要求小朋友们移动的距离和最小,第一个从“高”位开始排,输出最小移动距离即可。移动距离的定义如下所示:第二位小朋友移到第三位小朋友后面,移动距离为1,若移动到第四位小朋友后面,移动距离为2。现在有一队小朋友,他们高矮不同,,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。1:其实题目理解之后就知道,目标是要保证最小移动距离,且以高位为起点。2:try catch 异常处理。

MISAYAONE的博客 3144

[嵌入式系统设计师]大小端解析

嵌入式系统设计师大小端知识点记录

weixin_43580087的博客 225

基于STM32L4XX的环境光传感器(VCNL4040M3OE)应用程序设计

• 集成模块:红外发射器(IRED)、环境光传感器(ALS)、接近传感器(PS)及信号调理IC。#define VCNL4040_I2C_ADDR (0x60 << 1) // 7位地址左移一位。// 组合成16位值。// I2C总线句柄。// 设置参数:ALS集成时间160ms,中断禁止,ALS功能开启。// 设置参数:PS工作频率80Hz,开红外二极管,PS功能开启。// 初始化I2C外设。• 输出类型:I2C总线(ALS/PS)// 2. 配置环境光传感器 (ALS) 并启动。

myron6688的博客 143

关于BIT位域和大小端的理解

因此,在数据传输中,通常需要将数据从本机字节序统一转换成网络字节序(网络字节序为大端)然后传输,接收方接收数据后,再将数据转换为本机字节序。反过来说,大端数据0x5B 59 97 85传输给小端设备接收后,在内存的数据为5B 59 97 85,未做转换时,小端设备解析为0x85 97 59 5b,转换字节序之后为0x5B 59 97 85。任何在不同系统间的通信信息都经过网络字节(大端)序进行传输,也就是说不管本机是什么模式,都要保证发送端传输的数据转换为网络序,接受端都要把网络序的数据转换为本地序。

u014044624的博客 850

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LIN总线信号解析避坑指南:从物理值换算到大小端处理(附C语言代码模板)

本文深入解析LIN总线信号解析中的关键难点,提供从LIN矩阵表解读到C语言代码实现的完整避坑指南。重点探讨物理值换算的溢出防护、大小端处理的实战技巧以及共用体位域定义的跨平台实现,并附有汽车车窗控制模块的实战案例与可复用的代码模板,帮助开发者高效处理LIN信号解析任务。

ujm567890的博客 924

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LS1046 IFC接口实战:如何正确配置地址线复用与大小端模式(附CAN控制器案例)

本文深入解析了LS1046处理器IFC接口在NOR与GPCM模式下的核心配置,重点探讨了地址线复用与大小端模式的协同工作机制。通过一个真实的CAN控制器调试案例,详细阐述了如何正确配置ADM_SHFT和ADM_SHFT_MODE等寄存器,以确保CPU逻辑地址能准确映射到物理引脚,并提供从逻辑分析仪波形解读到参数迭代的实战调试方法。

sony5的博客 754

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C语言中的位域、字节序、比特序、大小端 (2012-03-22 09:19)(转载)

C语言中的位域、字节序、比特序、大小端 (2012-03-22 09:19) 标签: 转载  原文地址:C语言中的位域、字节序、比特序、大小端 作者:digdeep126 1.比特序 / 位序 /  bit numbering / bit endianness 我们知道一个字节有8位,也就是8个比特位。从第0位到第7位共8位。比特序就是用来描述比特位在字节中的存放顺序的。

495

C语言 结构体位域

C语言 结构体位域

嵌入式软硬件叶玄 642

Java对象结构与内置锁

文章目录 1. Java对象结构 2. 代码实践 3. Mark Word的结构信息 4. 大小端问题 5. 四种内置锁的概念 1. Java对象结构 先上图: 对象头 Mark Word: 标记字,存储自身运行时的数据,例如GC标志位、哈希码、锁状态等信息 Class Pointer: 类对象指针,存放方法区Class对象的地址,虚拟机通过这个指针来确定这个对象是哪个类的实例 Array Length: 数组长度,如果对象是一个Java数组,那么此字段必须有,用于记录数组长度的数据,不是

drnrrwfs的博客 188

联合体在嵌入式开发中的妙用

联合体在嵌入式开发中的妙用

langhua001的专栏 1122

位域与大小端

大小端字节序介绍见:点击打开链接

AlbertoNo1的博客 4032
上一篇: Virtual的一些总结
下一篇: Fedora13上折腾了下ACE
coder_xia
博客等级 码龄17年 151粉丝 143原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值