不使用 nonstandard\xe2\x80\xa1 Scalar_Storage_Order 子句,如何通过记录表示子句结合任何其他语言功能的任意组合来可移植地表示 IPv4 标头,以便 \ xe2\x80\x9c相同的\xe2\x80\x9d 代码适用于小端和大端处理器,但以 IETF 称为网络字节的方式在线上发出(例如,通过以太网帧的有效负载) order(这是 IETF 对 big-endian 的奇特名称)。在 C 中,\xe2\x80\x9c相同的\xe2\x80\x9d 代码可以利用预处理器宏在小端处理器上执行字节交换,但在大端处理器上不执行任何操作,但标准 Ada 没有预处理器。在 C++ 中,\xe2\x80\x9c相同的\xe2\x80\x9d 代码可以利用元模板编程 (MTP) 在小端处理器上执行字节交换,但在大端处理器上不执行任何操作,但是标准 Ada 缺乏 MTP。
\n\n(顺便说一句,当大端处理器与小端外设 IC 的内存映射寄存器接口时,设备驱动程序中也会出现同样的问题,反之亦然:小端处理器与大端 IC 接口时的内存映射寄存器。)
\n\n BytesPerWord : constant := 4;\n BitsPerByte : constant := 8;\n PowerOf2Highest : constant := BytesPerWord*BitsPerByte - 1; -- part #1 of byte-swap\n type Header_IPv4 is record\n Version : integer range 0 .. F#16;\n IHL : integer range 0 .. F#16;\n TOS : integer …Run Code Online (Sandbox Code Playgroud)