Re: Using GNAT.Sockets with Streams and Byte Swapping



"markp" <markwork66@xxxxxxxxx> writes:

> I am having a problem using GNAT.socket with streams. I can create a
> stream easily and send data as follows:
>
> Msg_Type'Write(
> My_Stream_Access,
> Msg);
>
> This will work fine of both machines are the same "endian". However, if
> I need to swap bytes on the variable Msg before I send, I get garbled
> data on the other end.
>
> Is there a problem with swapping bytes before the call to 'Write?

Not as far as I know. Though it's a much better idea to swap bytes
_in_ 'Write (and 'Read).

You can write your own 'Read, 'Write attribute subprograms.

Or, you can rebuild the runtime on both sides using an XDR version of
System.Stream_Attributes (s-stratt.adb).

In recent (supported) GNATs and in GCC 3.4, 4.0 this has been supplied
in s-strxdr.adb (so copy s-strxdr.adb to s-stratt.adb and rebuild --
see Makefile.adalib in your .../adalib directory under the GCC
runtime, though Some Assembly Will [probably] Be Required).

If you are on a PowerPC the only difference between doing this and
doing nothing on the PPC (running natively big-endian -- who does
otherwise?) is that natively Wide_Character is 2 bytes, while the XDR
form is 4 bytes.

There is a problem with s-strxdr.adb, it raises the wrong exception
(an internal Data_Error rather than the standed End_Error, ISTR).

What we ended up doing was using the native PPC s-stratt.adb and
writing our own on the x86 side to match what the PPC was doing
(easier to argue the acceptability of a vendor-supplied runtime, and
our delivery platform is the PPC!)
.



Relevant Pages

  • Re: readl/writel: swap or not to swap
    ... >>swap like ppc does? ... > linux arch on same board. ... Is the ppc way the right ... readl/writelare defined as being for the PCI bus (little endian). ...
    (Linux-Kernel)
  • Re: [PATCH] anobjrmap 1/6 objrmap
    ... >> as soon as it hits swap). ... I was talking all archs but ppc of course when I said rock ... archs seems already working fine. ... send the line "unsubscribe linux-kernel" in ...
    (Linux-Kernel)