4

非標準‡ 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 固有の機能を使用することはできません。

4

1 に答える 1