SUMMARY: Converting endianness on Alpha

From: Arno Hahma <arno_at_nitro.pp.utu.fi>
Date: Fri, 19 Jun 1998 14:24:52 +0300 (EET DST)

Thank you for a huge number of informative responses:

Lucio Chiappetti
Peter Stern
lombardi emanuele
Andrew L. Weston
David Nicholson
Burch Seymour
Serge MUNHOVEN
Luke Liu
Roddy McColl
Oisin McGuinness
Brian C Hill
etc.

The problem appeared to be much more complicated than I first thought.

First of all, the data to be converted affects how the conversion
should be done. If the data type is integral (like int, char,
unsigned char, long, etc.), you may be able to use dd with
conv=swab. If it is not integral, such as double, float, complex
etc. then there are more difficulties and the exact structure of the
data to be converted should be known.

Possibilities how to do the actual conversion (to convert
a binary datafile to Alpha-format):

1. dd conv=swab. This works for short integer type at least (16-bit),
   might work for others, too. For non-integral data, it does not work.

2. Sex is the answer ;-). /usr/include/sex.h contains macros for doing
   the conversion by words or by half words. Sex works for integral data
   only.

3. Fortran program. In DEC fortran, there are conversion specifiers,
   when reading unformatted binary data. Specify CONV='conversion
   type' for the OPEN -statement, where the file is used, e.g.

   OPEN(1,FILE='filename',CONV='conversion',ACCESS='access type')

   big_endian is one of the conversion types. You can also provide
   switches to the compiler, say: man f77 and search for
   "endian".

   This approach works for non-integral data as well, provided you can
   read the file with the fortran program. There might be problems
   with record lengths or data over- or underruns. Whatever, a fortran
   program is a bit clumsy, if the data is not of equal length in
   every run.

4. C-language utilities uread and uswap; not included in DU, but
   available from the Net. These can do a conversion on
   a variety of formats, even if they are mixed in the file. However,
   in the case of IEEE big endian double I couldn't get anything
   sensible out of these. That was probably due to mixed data
   in the files, i.e. I tried converting data, that is not really
   valid floating point values.

5. The best one last:

   There is a nice function provided in the DEC Math library. Say: man
   cvt_ftof. It can convert a variety of floating point formats and you
   can choose freely, from which one to which one. This is the way I
   took, I wrote a short C-program, that reads the big endian data and
   outputs little-endian using cvt_ftof. It also doesn't care, whether
   the data is valid or not, so you can run the entire file through
   cvt_ftof and then extract the valid part out of it afterwards. Just
   make sure the data is aligned correctly or everything will break.
   Of course, anything else but the correct floating point data in the
   file will be trashed from applying cvt_ftof on it.

ArNO
    2
Received on Fri Jun 19 1998 - 13:30:47 NZST

This archive was generated by hypermail 2.4.0 : Wed Nov 08 2023 - 11:53:38 NZDT