当前位置:首页 > 开发 > 移动开发 > 正文

大端小端转换,le32_to_cpu 和cpu_to_le32

发表于: 2012-08-16   作者:aijuans   来源:转载   浏览:
摘要: 大端小端转换,le32_to_cpu 和cpu_to_le32  字节序 http://oss.org.cn/kernel-book/ldd3/ch11s04.html         小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)

大端小端转换,le32_to_cpu 和cpu_to_le32

 字节序

http://oss.org.cn/kernel-book/ldd3/ch11s04.html

        小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高级的平台以另一种方式(大端)工作. 任何可能的时候, 你的代码应当这样来编写, 它不在乎它操作的数据的字节序. 但是, 有时候一个驱动需要使用单个字节建立一个整型数或者相反, 或者它必须与一个要求一个特定顺序的设备通讯.

        包含文件 <asm/byteorder.h> 定义了或者 __BIG_ENDIAN 或者 __LITTLE_ENDIAN, 依赖处理器的字节序. 当处理字节序问题时, 你可能编码一堆 #ifdef __LITTTLE_ENDIAN 条件语句, 但是有一个更好的方法. Linux 内核定义了一套宏定义来处理之间的转换, 在处理器字节序和你需要以特定字节序存储和加载的数据之间. 例如:

u32 cpu_to_le32 (u32);
u32 le32_to_cpu (u32);

        这 2 个宏定义转换一个值, 从无论 CPU 使用的什么到一个无符号的, 小端, 32 位数, 并且转换回. 它们不管你的 CPU 是小端还是大端, 不管它是不是 32-位 处理器. 在没有事情要做的情况下它们原样返回它们的参数. 使用这些宏定义易于编写可移植的代码, 而不必使用大量的条件编译建造.

        有很多类似的函数; 你可以在 <linux/byteorder/big_endian.h> 和 <linux/byteorder/little_endian.h> 中见到完整列表. 一会儿之后, 这个模式不难遵循. be64_to_cpu 转换一个无符号的, 大端, 64-位 值到一个内部 CPU 表示. le16_to_cpus, 相反, 处理有符号的, 小端, 16 位数. 当处理指针时, 你也会使用如 cpu_to_le32p, 它使用指向一个值的指针来转换, 而不是这个值自身. 剩下的看包含文件.

 

Then when do we use le32_to_cpu( ) , and when do we use cpu_to_le32( )? 
> 
> The names tell it.

> le32_to_cpu is used for convesions from 32bit little endian data into CPUs endianness

> cpu_to_le32 is used for convesions from CPU endianness to little endian 32bit data. 
> Actually, both macros do the same thing, but one should make the differences clear to make code more readable so that anyone can quickly find out whether some data is kept in native endianness or some particular one. 

 

大端小端转换,le32_to_cpu 和cpu_to_le32

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
2.1.101. --littleend 此选项指示编译器使用小端内存为 ARM 处理器生成代码。 在小端内存中,字的最
大端:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中; 小端:数据的低位保存
基本概念 我们可以把计算机的内存抽像成一个大的数组,在这个数组中,包含了一个个的字节元素。对于
判断大端小端机器 int i = 0X12345678 0X12 0X34 0X56 0X78 大端存储(Big Endian) 按照字符串从左向
何为大端序,小端序? 简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,
关于字节序(大端法、小端法)的定义 《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪
在 各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很
大端模式和小端模式 试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的
大端格式、小端格式 大端格式: 在这种格式中,字数据的高字节存储在低地址中,而字数据的低字节则
在各种计算机体系结构中,对于字节、字等的存储机制有所不同,因而引发了计算机 通信领 域中一个很
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号