如果不在最近的GNAT版本中使用非标准的‡Scalar_Storage_Order clause,那么如何通过记录表示条款和任何其他语言功能的任意组合来便携地表示IPv4标头,以便“相同”代码可以工作在IETF调用网络字节顺序(这是IETF对big-endian的奇特名称)中,可以通过线路(例如,通过以太网帧的有效负载)发送小端和大端处理器 . 在C语言中,“相同”代码可以利用预处理器宏在little-endian处理器上执行字节交换,但在big-endian处理器上是无操作,但标准Ada没有预处理器 . 在C语言中,“相同”代码可以利用元模板编程(MTP)在小端处理器上执行字节交换,但在大端处理器上是无操作,但标准的Ada缺少MTP .
(顺便说一下,当大端处理器与小端外设IC的存储器映射寄存器接口时,设备驱动程序出现了同样的问题,反之亦然:小端处理器与大端IC的存储器映射寄存器接口 . )
BytesPerWord : constant := 4;
BitsPerByte : constant := 8;
PowerOf2Highest : constant := BytesPerWord*BitsPerByte - 1; -- part #1 of byte-swap
type Header_IPv4 is record
Version : integer range 0 .. F#16;
IHL : integer range 0 .. F#16;
TOS : integer range 0 .. FF#16;
Length : integer range 0 .. FF#16;
Ident : integer range 0 .. FFFF#16;
Flags : integer range 0 .. 7#16;
Frag_Offs : integer range 0 .. 1FFF#16;
end record;
type Header_IPv4_Homogenous is new Header_IPv4;
for Header_IPv4_Homogenous use record -- Good-to-go for big-endian processors
Version at 0*BytesPerWord range 0 .. 3;
IHL at 0*BytesPerWord range 4 .. 7;
TOS at 0*BytesPerWord range 8 .. 15;
Length at 0*BytesPerWord range 16 .. 31;
Ident at 1*BytesPerWord range 0 .. 15;
Flags at 1*BytesPerWord range 16 .. 18;
Frag_Offs at 1*BytesPerWord range 19 .. 31;
end record;
for Header_IPv4_Homogenous'Alignment use 4;
for Header_IPv4_Homogenous'Bit_Order use High_Order_First;
type Header_IPv4_Heterogenous is new Header_IPv4;
for Header_IPv4_Heterogenous use record -- Good-to-go??? for little-endian processors?
Version at 0*BytesPerWord range PowerOf2Highest- 3 .. PowerOf2Highest- 0; -- p
IHL at 0*BytesPerWord range PowerOf2Highest- 7 .. PowerOf2Highest- 4; -- a
TOS at 0*BytesPerWord range PowerOf2Highest- 15 .. PowerOf2Highest- 8; -- r
Length at 0*BytesPerWord range PowerOf2Highest- 31 .. PowerOf2Highest- 16; -- t
Ident at 1*BytesPerWord range PowerOf2Highest- 15 .. PowerOf2Highest- 0; --
Flags at 1*BytesPerWord range PowerOf2Highest- 18 .. PowerOf2Highest- 16; -- #
Frag_Offs at 1*BytesPerWord range PowerOf2Highest- 31 .. PowerOf2Highest- 19; -- 2
end record;
for Header_IPv4_Heterogenous'Alignment use 4;
for Header_IPv4_Heterogenous'Bit_Order use Low_Order_First; -- part #3 of byte-swap
注意如何将字节交换的第2部分中的“PowerOf2Highest减去”和“反转”来自(从,到)顺序到[视觉上,而非算术真实](从,到)顺序的大端字节ID粗略等同于VHDL的下降,这是VHDL如何解决这种异类端问题的关键部分 . (VHDL是Ada83的堂兄语言 . )
但是现在,如何混淆集合中的哪个成员{Header_IPv4_Homogenous,Header_IPv4_Heterogenous}已被选为app-domain-code中的类型名称Header_IPv4_Portable?使用儿童套餐?
‡Scalar_Storage_Order has been proposed作为下一版Ada ISO标准的潜在特征,但到目前为止还没有官方赞助商在ISO标准化委员会中支持该提案,因此标准化提案可能会在葡萄藤上死亡 . 另外,我将使用非GNAT Ada编译器,因此我无法使用GNAT特定功能 .