From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=AC_FROM_MANY_DOTS,BAYES_00 autolearn=no autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!news.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "Jeffrey R. Carter" Newsgroups: comp.lang.ada Subject: Byte Swapping Date: Fri, 2 Dec 2016 09:23:32 -0700 Organization: Also freenews.netfront.net; news.tornevall.net; news.eternal-september.org Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Injection-Date: Fri, 2 Dec 2016 16:22:20 -0000 (UTC) Injection-Info: mx02.eternal-september.org; posting-host="593194b5199673f1b03ecb1c26710b54"; logging-data="27344"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX180CMyCP4a47XrqQ/QJ1sWq7RNsL54cXiA=" User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 X-Mozilla-News-Host: news://news.eternal-september.org:119 Cancel-Lock: sha1:p0i9nfgu+jMwzslezmxlOSajsDU= Xref: news.eternal-september.org comp.lang.ada:32557 Date: 2016-12-02T09:23:32-07:00 List-Id: Recently on Ada-Comment there was a discussion of a GNAT aspect that changes the byte order of scalars. Brukardt said, "In the past, we have not be willing to require compilers to be able to generate byte swapping code." However, I think the standard has required compilers to generate byte-swapping code since Ada 83. On a little-endian, twos-complement, byte-addressable machine, such as x86, we could say Byte_Size : constant := 8; Word_Size : constant := 2 * Byte_Size; type Byte is range -(2 ** (Byte_Size - 1) ) .. 2 ** (Byte_Size - 1) - 1; for Byte'Size use Byte_Size; type Word is range -(2 ** (Word_Size - 1) ) .. 2 ** (Word_Size - 1) - 1; for Word'Size use Word_Size; -- Signed types for Ada-83 compatibility type Unswapped_Bytes is record MSB : Byte; LSB : Byte; end record; for Unswapped_Bytes use record MSB at 1 range 0 .. 7; LSB at 0 range 0 .. 7; end record; for Unswapped_Bytes'Size use Word_Size; -- Default LE byte order: LSB at offset 0, MSB at offset 1 type Swapped_Bytes is new Unswapped_Bytes; for Swapped_Bytes use record MSB at 0 range 0 .. 7; LSB at 1 range 0 .. 7; end record; for Swapped_Bytes'Size use Word_Size; -- BE byte order: MSB at offset 0, LSB at offset 1 IIUC, type conversion between these two record types performs byte swapping. So, with function To_Unswapped is new Unchecked_Conversion (Source => Word, Target => Unswapped_Bytes); function To_Word is new Unchecked_Conversion (Source => Swapped_Bytes, Target => Word); W : Word; To_Word (Swapped_Bytes (To_Unswapped (W) ) ) produces a Word with the bytes of W swapped. Barring any errors I've injected, this should be valid Ada 83 and all later version of the language. -- Jeff Carter "Unix and C are the ultimate computer viruses." Richard Gabriel 99