This module offers an interface to portably work with byte
arrays whose contents are known to be of a fixed endianness.
There are two ways to use this module:
Untyped Conversions: The functions toBigEndian, toLittleEndian,
fromBigEndian, and fromLittleEndian convert between native-endian
words and big/little-endian words. The word resulting from
to(Big|Little)Endian should be written to a primitive byte
array or a pointer afterwards. (There is no other purpose of
such a conversion.) Similarly, the argument to from(Big|Little)Endian
should be a word that was read from a primitive byte array or
a pointer. This interface is useful when serializing or deserializing
a data structure with fields of varying sizes.
Typed Conversions: The type Fixed provides a convenient
type-directed interface to working with arrays of homogenous words.
This interface is easier to use and should be preferred when
possible.
The example at the bottom of this page demonstrates how to use the
type-directed interface.
A word whose byte order is specified (not platform dependent)
when working with Prim, Storable, and PrimUnaligned (this
last instance is provided alongside the typeclass itself in the
primitive-unaligned library).
Types that are represented as a fixed-sized word. For these
types, the bytes can be swapped. The instances of this class
use byteswapping primitives and compile-time knowledge of native
endianness to provide portable endianness conversion functions.
Instances11Bytes, …
BytesInt16Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesInt32Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesInt64Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesInt8Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWord16Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWord32Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWord64Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWord8Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWordDefined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWord128Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
BytesWord256Defined in byte-order-0.1.3.1 · System.ByteOrder.Class
A byte order that can be interpreted as a conversion function.
This class is effectively closed. The only instances are for
BigEndian and LittleEndian. It is not possible to write more
instances since there are no other inhabitants of ByteOrder.
Suppose there is a protocol for aggregating numbers that uses stream
sockets for communication. The protocol interprets all numbers as
unsigned. It is described as follows:
The client sends the server a little-endian 16-bit number N.
This is how many numbers will follow.
The client sends N little-endian 64-bit numbers to the server.
The server responds with two little-endian 64-bit numbers:
the sum and the product of the N numbers it received.
Assume the existence of a send and receive that block until
the total number of requested bytes have been handled. They both
work on their argument arrays starting at index zero, which ensures
that any 2-byte, 4-byte, or 8-byte types will be aligned properly.
(GHC always machine-word aligns the payload of a byte array.)
Additionally, assume the typed and untyped functions that convert between
PrimArray and ByteArray by changing out the data constructor.
send :: Socket -> ByteArray -> IO ()
receive :: Socket -> Int -> IO ByteArray
typed :: ByteArray -> PrimArray a
untyped :: PrimArray a -> ByteArray
For simplicity, all error-handling is omitted. With the type-directed
interface, the server is implemented as:
Not every explicit type annotation above is needed. Some are provided
for the reader's benefit. As long as the user ensures that the
typed primitive arrays use Fixed in their element types, the endianness
conversions are guaranteed to be correct.