byte order and bit order

rick at tmiuv0.uucp rick at tmiuv0.uucp
Wed Jun 27 21:03:22 AEST 1990


In article <1990Jun20.182745.3730 at csrd.uiuc.edu>, pommerel at sp30.csrd.uiuc.edu (Claude Pommerell) writes:
> In article <1990Jun19.221359.7399 at ecn.purdue.edu>,
> luj at delta.ecn.purdue.edu (Jun Lu) writes:
> |>Aslo, what's the byte order for a binary UNIX disk file ?  In other words,
> |>if a 4-byte integer( for example) is written to a disk file by using
> |>write/fwrite, what's the byte order of the interger as stored in the disk
> |>file ?   Is byte-swapping necessary if the integer is going to be
> retrieved by
> |>using read/fread ?
> 
> There is no standard byte ordering for binary UNIX files. You have to do
> byte-swapping
> when reading data generated on a big-endian to be read by a small-endian
> or vice versa.

In fact, it can get even more complicated.  Now, this goes back a few years,
but the old Whitesmiths C on VAXen and PDP-11s (RSX/RT-11) had to store
multi-byte variables in several formats.  Both systems are little-endian
and store two byte ints in ascending order (low byte to high byte).  On the
VAX, longs (4-byte integers) were stored in ascending order (low byte to
high byte), while on the PDP-11s, longs were stored as two integers (each
low byte to high byte), but the integers themselves were stored with the
_most_ significant int stored first.  Assuming a 4-byte integer with bytes
numbered 0 to 3, a VAX stored them:

    Address:   0    1    2    3
    Data byte: 0    1    2    3

while the PDP stored them:

    Address:   0    1    2    3
    Data byte: 2    3    0    1

In much of my code (which had to have data portability between the systems),
I ended up defining a preprocessor symbol, "WSWAP" (word swapped) which was
TRUE for PDP-11s, but FALSE for VAXEN.  I suspect that this strange behaviour
was caused by the fact that PDP-11s don't have a natural "long" (4-byte)
variable type, and one had to be manufactured.  The VAX, of course, has
4-byte variables, since that's the natural size of the machine.

However, if you used their buffered file I/O routines (putf, getf), disk
files were compatible.  That entailed linking in lots of library code, so I
ended up using the Unixish I/O (read, write) and dealing with this problem
myself.
-- 
  .-------------------------------------------------------------------------.
 / [- O] Rick Stevens (All opinions are mine. Everyone ignores them anyway.) \
|    ?   +--------------------------------------------------------------------|
|    V   | uunet!zardoz!tmiuv0!rick             (<-- Work (ugh!))             |
|--------+ uunet!zardoz!xyclone!sysop           (<-- Home Unix (better!))     |
|  uunet!perigrine!ccicpg!conexch!amoeba2!rps2  (<-- Home Amiga (Best!!)      |
 \ 75006.1355 at compuserve.com (CIS: 75006,1355)  (<-- CI$)                    /
  `-------------------------------------------------------------------------'
"I am firm.  You are obstinate.  He is pigheaded!"
                                         - James P. Hogan



More information about the Comp.lang.c mailing list