Fuchsia endian 政策

虽然 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。如需转换整数值,请使用这些方法