Hacker's guide
Endianness
Some files contain numbers that have a fixed endianness,
independent from the endianness of the CPU DeuTex happens to run
on. These call for some special treatment, as the C language has
no provision for reading and writing integers otherwise than in
the native endianness.
- To read an integer from a file with a particular endianness,
use use
fread_i16_le()
,
fread_i16_be()
, fread_i32_le()
and
fread_i32_be()
. The first argument is the file
descriptor, the second argument is a pointer on a variable that
will receive the value read from the file.
- To write an integer to a file with a particular endianness,
use
fwrite_i16_le()
, fwrite_i16_be()
,
fwrite_i32_le()
and fwrite_i32_be()
.
The first argument is the file descriptor, the second argument
is the value to write.
- To read an integer with a particular endianness from a
memory area, use
read_i16_le()
,
read_i16_be()
, read_i32_le()
and
read_i32_be()
. The first argument is a pointer on
the memory area, the second argument is a pointer on a variable
that will receive the value read from the memory area.
Alternatively, you can use the peek_i*()
functions
that take no second argument but instead return the read value.
- To write an integer with a particular endianness to a memory
area, use
write_i16_le()
,
write_i16_be
, write_i32_le()
and
write_i32_be()
. The first argument is a pointer on
the memory area, the second argument is the value to write.
Mnemonic to remember the arguments order : the object that
has a defined endianness is considered central and therefore
always comes first.
Here is some sample code and the result of running it.
fwrite_i32_be (stdout, 0x12345678);
fwrite_i32_le (stdout, 0x12345678);
fwrite_i16_be (stdout, 0xabcd);
fwrite_i16_le (stdout, 0xabcd);
12 34 56 78 78 56 34 12 AB CD CD AB