虽然 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__);
或附加注释来说明哪些文件 不兼容。
(什么都不做是可以的,但最好还是明确指出 不兼容。)
如果模块必须处理字节序问题
在固有字节序的结构中,最好添加 “转换”从小端字节序数据转换为 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。如需转换整数值,请使用这些方法。