虽然 Fuchsia 仅在小端字节 (LE) CPU 架构上运行,但 Fuchsia 项目仍然需要考虑大端字节 (BE) 问题。
本页介绍了以下内容:
- 出现字节序问题的位置
- 如何处理
- 做出这些选择的原因
出现字节序问题的位置
外设硬件
许多外设硬件定义了多字节 BE 值,这些值必须进行转换。
旧格式
网络字节顺序为 BE。 SCSI 数据结构为 BE。
大端字节序 CPU 执行
即使 Fuchsia 从未在 BE CPU 上运行(至少从理论上来讲,将来可能会运行),但我们的一些代码也可以移植到 BE CPU 上。
每当我们定义多字节值时,都会造成其他平台可能想要写入或读取该值,并且我们的代码(开源)可以移植到该平台来实现这一点。
如何处理 C/C++ 代码和文档中的字节序问题
模块不太可能遇到任何字节序问题
许多模块不需要处理字节序问题;其数据只能由运行 Fuchsia 的单个 CPU 解析。
对于可能移植到其他操作系统或其数据可能通过任何渠道导出的图片,请执行以下操作:
C 或 C++ 中建议的样式是
#include <endian.h>
...
static_assert(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__);
也可以在每个文件中使用,或者附上注释来说明哪些文件不兼容。
(可以不执行任何操作,但最好明确地表明代码与 BE 不兼容。)
模块是否必须处理字节序问题
在本身具有字节序的结构中,最好添加用于将小端字节序“转换”为 CPU 字节序的宏,这是一种自记录代码形式。当然,big-endian 数据应始终使用这些宏。
对于 C/C++
最佳方式是使用 endian.h 中的 LE16 .. BE64 宏,这些宏应在包括 DDK 在内的任何位置提供。
#include <endian.h>
...
hw_le_struct.int_field = LE32(program_int);
program_long = BE64(hw_be_struct.long_field);
适用于 Rust
如需访问字节缓冲区中的多字节值,请使用此 crate。如需转换整数值,请使用这些方法。