C++获取平台的大小端

1 static union { char c[4]; unsigned long mylong; } endian_test = {{ ‘l‘, ‘?‘, ‘?‘, ‘b‘ } };
2
3 #define ENDIANNESS ((char)endian_test.mylong)

如果ENDIANNESS=’l’表示系统为little endian,
为’b’表示big endian

时间: 2024-10-17 18:01:05

C++获取平台的大小端的相关文章

请讲普通话——一场关于异构平台通信的风波(粘包·大小端方式·网络字节序)

一.引子 前段时间用StriveEngine做一个信息采集系统,服务器是Windows的,客户端是各种单片机,以及Unix等等平台.这些异构的平台,被我召集起来“加强对话, 扩大共识, 深化合作”.都说有人的地方就有江湖,讲真,机器世界也一样!这些异构的平台,平日里各自为政,井水不犯河水,倒也相安无事.如今群雄会盟,共商大计,如我所料,势必会上演一波真正的血雨腥风! 就像新闻联播里常说的,“加强对话, 扩大共识, 深化合作”,首先得“加强对话”吧. 看着各位爷陆续到场,我稍稍清了清嗓子,不揣冒昧

一场关于异构平台通信的风波(粘包·大小端方式·网络字节序)

一.引子 前段时间用StriveEngine做一个信息采集系统,服务器是Windows的,客户端是各种单片机,以及Unix等等平台.这些异构的平台,被我召集起来“加强对话, 扩大共识, 深化合作”.都说有人的地方就有江湖,讲真,机器世界也一样!这些异构的平台,平日里各自为政,井水不犯河水,倒也相安无事.如今群雄会盟,共商大计,如我所料,势必会上演一波真正的血雨腥风! 就像新闻联播里常说的,“加强对话, 扩大共识, 深化合作”,首先得“加强对话”吧. 看着各位爷陆续到场,我稍稍清了清嗓子,不揣冒昧

linux kernel 如何处理大小端

暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们就以readl为例,针对big-endian处理器,如何来对寄存器数据进行处理. kernel下readl定义如下,在include/asm-generic/io.h #define readw(addr) __le32_to_cpu(__raw_readw(addr)) __raw_readl是最

C 学习之大小端

题外话:如有误,请留言通知我. 大小端,是数值在内存中的排列方式:数值的高低位与内存地址的大小 的关系. 大/小端,英文Big/Little Endian. 注意:endian,就是字节序.字节存储顺序的意思,也有尾数的意思.这里取尾数的含义刚刚好,原因如下. 先说一个前提:内存地址的前xx位通常是系统保留区,用于运行内核程序.所以用户程序就从另一端开始占用 --- 这就是为什么用户程序是从高位地址开始往低位地址伸展.(另一种可能本文不考虑) 在上面的前提下,我们已知int类型的长度是4 byt

内存对齐和大小端

一.内存对齐的原因 根本原因:cpu是根据内存访问粒度(memory access granularity,下文简写成MAG)来读取内存,MAG就是cpu一次内存访问操作的数据量,具体数值依赖于特定的平台,一般是2byte.4byte.8byte. 内存对齐:更够减少内存读取次数(相对于内存不对齐),为了访问未对齐的内存,处理器需要作两次内存访问:而对齐的内存访问仅需要一次访问. 二.内存对齐的步骤 每个平台上的编译器都有自己的默认“对齐系数”.同时,我们也可以通过预编译命令#pragma pa

关于大小端问题和字节序问题的一些总结

1.大小端是不同的对于数据在内存地址中的存放方式,不同的处理器(平台)的数据存储方式是不同.的如果 实现跨平台通信则大小端是不能忽视的问题. 大端模式:数据的高位存储在内存的低字节.ARM/PowerPC等处理器采用大端模式 小端模式:数据的地位存储在内存的低字节.Intel架构处理器采用小端模式. 如一个数据:0x12345678;对应内纯地址是0x00~0x03. 大端模式: 小端模式: 地址:0x00 0x01 0x02 0x03 地址:0x00 0x01 0x02 0x03 数据:0x1

关于字符集,编码格式,大小端的简单总结

只要你和计算机打交道,这些问题可以说是天天会遇到,但是很多人是似懂非懂, 能真正完全理解的人却不多, 下面是个人的一些理解,有错欢迎指正. 最早的计算机只支持ASCII码, 具体来说就是用1个字节(最高位为0, 没有用)表示0到127,总共128个字符, 这样就可以完全满足英语应用的要求了. 后来扩展到欧洲语系,理论上一个字节可以表示256个字符, 欧洲人就把剩余的128个字符(最高位为1)按照自己语言(法语,德语...)的要求扩充应用了起来, 好像也能满足需要. 然后又到了亚洲国家,比如中国,

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

字节顺序与大小端

1.概念: 1)小端:操作数的存放方式是高地址存放高字节. 0x1234,存放地址为0x2000 内存地址 存放内容 0x2000 0x34 0x2001  0x12 2)大端:操作数的存放方式是高地址存放低字节.    0x1234,存放地址为0x2000 内存地址 存放内容 0x2000 0x12 0x2001  0x34 x86平台采用的是小端模式,网络字节顺序是大端模式. 2.检测系统大小端 1)调用库检测 1 #include<endian.h> 2 #include<stdi