非標準‡ Scalar_Storage_Order 句を使用しない場合GNAT の最近のリリースでは、「同じ」コードがリトル エンディアンとビッグ エンディアンの両方で機能するように、他の言語機能の任意の組み合わせと組み合わせて、レコード表現句を介して IPv4 ヘッダーを移植可能に表現するにはどうすればよいでしょうか。 -エンディアン プロセッサですが、IETF がネットワーク バイト オーダー (ビッグ エンディアンに対する IETF の派手な名前) と呼んでいるもので (たとえば、イーサネット フレームのペイロードを介して) 送信されます。C では、「同じ」コードがプリプロセッサ マクロを使用してリトル エンディアン プロセッサでバイト スワップを実行できますが、ビッグ エンディアン プロセッサでは何もしませんが、標準の 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
「PowerOf2Highest マイナス」およびビッグエンディアンのビット ID を (from,to) 順序から [視覚的に、実際には算術的にではなく] (to,from) 順序に「反転」する方法が、バイトスワップのパート 2 でこれは、VHDL がこの異種エンディアンの問題を解決する方法の重要な部分です。(VHDL は Ada83 のいとこ言語です。)
しかし今、セット {Header_IPv4_Homogenous, Header_IPv4_Heterogenous} のどのメンバーが app-domain-code でタイプ名 Header_IPv4_Portable として選択されているかを難読化する方法は? 子パッケージを使用しますか?
‡ Scalar_Storage_Orderは、Ada の ISO 標準の次の版の潜在的な機能として提案されていますが、これまでのところ、ISO 標準化委員会でこの提案を擁護する公式のスポンサーがいないため、標準化の提案はどこへ行って、つるの中で死ぬ可能性があります。さらに、GNAT 以外の Ada コンパイラを使用するため、GNAT 固有の機能を使用することはできません。