13b4b8bdaSRobert Mustacchi.\"
23b4b8bdaSRobert Mustacchi.\" This file and its contents are supplied under the terms of the
33b4b8bdaSRobert Mustacchi.\" Common Development and Distribution License ("CDDL"), version 1.0.
43b4b8bdaSRobert Mustacchi.\" You may only use this file in accordance with the terms of version
53b4b8bdaSRobert Mustacchi.\" 1.0 of the CDDL.
63b4b8bdaSRobert Mustacchi.\"
73b4b8bdaSRobert Mustacchi.\" A full copy of the text of the CDDL should have accompanied this
83b4b8bdaSRobert Mustacchi.\" source.  A copy of the CDDL is also available via the Internet at
93b4b8bdaSRobert Mustacchi.\" http://www.illumos.org/license/CDDL.
103b4b8bdaSRobert Mustacchi.\"
113b4b8bdaSRobert Mustacchi.\"
123b4b8bdaSRobert Mustacchi.\" Copyright 2016 Joyent, Inc.
133b4b8bdaSRobert Mustacchi.\"
143b4b8bdaSRobert Mustacchi.Dd January 31, 2016
153b4b8bdaSRobert Mustacchi.Dt BYTEORDER 5
163b4b8bdaSRobert Mustacchi.Os
173b4b8bdaSRobert Mustacchi.Sh NAME
183b4b8bdaSRobert Mustacchi.Nm byteorder ,
193b4b8bdaSRobert Mustacchi.Nm endian
203b4b8bdaSRobert Mustacchi.Nd byte order and endianness
213b4b8bdaSRobert Mustacchi.Sh DESCRIPTION
223b4b8bdaSRobert MustacchiInteger values which occupy more than 1 byte in memory can be laid out
233b4b8bdaSRobert Mustacchiin different ways on different platforms. In particular, there is a
243b4b8bdaSRobert Mustacchimajor split between those which place the least significant byte of an
253b4b8bdaSRobert Mustacchiinteger at the lowest address, and those which place the most
263b4b8bdaSRobert Mustacchisignificant byte there instead. As this difference relates to which
273b4b8bdaSRobert Mustacchiend of the integer is found in memory first, the term
283b4b8bdaSRobert Mustacchi.Em endian
293b4b8bdaSRobert Mustacchiis used to refer to a particular byte order.
303b4b8bdaSRobert Mustacchi.Pp
313b4b8bdaSRobert MustacchiA platform is referred to as using a
323b4b8bdaSRobert Mustacchi.Em big-endian
333b4b8bdaSRobert Mustacchibyte order when it places the most significant byte at the lowest
343b4b8bdaSRobert Mustacchiaddress, and
353b4b8bdaSRobert Mustacchi.Em little-endian
363b4b8bdaSRobert Mustacchiwhen it places the least significant byte first. Some platforms may also
373b4b8bdaSRobert Mustacchiswitch between big- and little-endian mode and run code compiled for
383b4b8bdaSRobert Mustacchieither.
393b4b8bdaSRobert Mustacchi.Pp
403b4b8bdaSRobert MustacchiHistorically, there have also been some systems that utilized
413b4b8bdaSRobert Mustacchi.Em middle-endian
423b4b8bdaSRobert Mustacchibyte orders for integers larger than 2 bytes. Such orderings are not in
433b4b8bdaSRobert Mustacchicommon use today.
443b4b8bdaSRobert Mustacchi.Pp
453b4b8bdaSRobert MustacchiEndianness is also of particular importance when dealing with values
463b4b8bdaSRobert Mustacchithat are being read into memory from an external source. For example,
473b4b8bdaSRobert Mustacchinetwork protocols such as IP conventionally define the fields in a
483b4b8bdaSRobert Mustacchipacket as being always stored in big-endian byte order. This means that
493b4b8bdaSRobert Mustacchia little-endian machine will have to perform transformations on these
503b4b8bdaSRobert Mustacchifields in order to process them.
513b4b8bdaSRobert Mustacchi.Ss Examples
523b4b8bdaSRobert MustacchiTo illustrate endianness in memory, let us consider the decimal integer
533b4b8bdaSRobert Mustacchi2864434397. This number fits in 32 bits of storage (4 bytes).
543b4b8bdaSRobert Mustacchi.Pp
553b4b8bdaSRobert MustacchiOn a big-endian system, this integer would be written into memory as
563b4b8bdaSRobert Mustacchithe bytes 0xAA, 0xBB, 0xCC, 0xDD, in order from lowest memory address to
573b4b8bdaSRobert Mustacchihighest.
583b4b8bdaSRobert Mustacchi.Pp
593b4b8bdaSRobert MustacchiOn a little-endian system, it would be written instead as the bytes
603b4b8bdaSRobert Mustacchi0xDD, 0xCC, 0xBB, 0xAA, in that order.
613b4b8bdaSRobert Mustacchi.Pp
623b4b8bdaSRobert MustacchiIf both the big- and little-endian systems were asked to store this
633b4b8bdaSRobert Mustacchiinteger at address 0x100, we would see the following in each of their
643b4b8bdaSRobert Mustacchimemory:
653b4b8bdaSRobert Mustacchi.Bd -literal
663b4b8bdaSRobert Mustacchi
673b4b8bdaSRobert Mustacchi                    Big-Endian
683b4b8bdaSRobert Mustacchi
693b4b8bdaSRobert Mustacchi        ++------++------++------++------++
703b4b8bdaSRobert Mustacchi        || 0xAA || 0xBB || 0xCC || 0xDD ||
713b4b8bdaSRobert Mustacchi        ++------++------++------++------++
723b4b8bdaSRobert Mustacchi            ^^      ^^      ^^      ^^
733b4b8bdaSRobert Mustacchi          0x100   0x101   0x102   0x103
743b4b8bdaSRobert Mustacchi            vv      vv      vv      vv
753b4b8bdaSRobert Mustacchi        ++------++------++------++------++
763b4b8bdaSRobert Mustacchi        || 0xDD || 0xCC || 0xBB || 0xAA ||
773b4b8bdaSRobert Mustacchi        ++------++------++------++------++
783b4b8bdaSRobert Mustacchi
793b4b8bdaSRobert Mustacchi                  Little-Endian
803b4b8bdaSRobert Mustacchi.Ed
813b4b8bdaSRobert Mustacchi.Pp
823b4b8bdaSRobert MustacchiIt is particularly important to note that even though the byte order is
833b4b8bdaSRobert Mustacchidifferent between these two machines, the bit ordering within each byte,
843b4b8bdaSRobert Mustacchiby convention, is still the same.
853b4b8bdaSRobert Mustacchi.Pp
863b4b8bdaSRobert MustacchiFor example, take the decimal integer 4660, which occupies in 16 bits (2
873b4b8bdaSRobert Mustacchibytes).
883b4b8bdaSRobert Mustacchi.Pp
893b4b8bdaSRobert MustacchiOn a big-endian system, this would be written into memory as 0x12, then
903b4b8bdaSRobert Mustacchi0x34.
913b4b8bdaSRobert Mustacchi.Pp
923b4b8bdaSRobert MustacchiOn a little-endian system, it would be written as 0x34, then 0x12.  Note
933b4b8bdaSRobert Mustacchithat this is not at all the same as seeing 0x43 then 0x21 in memory --
943b4b8bdaSRobert Mustacchionly the bytes are re-ordered, not any bits (or nybbles) within them.
953b4b8bdaSRobert Mustacchi.Pp
963b4b8bdaSRobert MustacchiAs before, storing this at address 0x100:
973b4b8bdaSRobert Mustacchi.Bd -literal
983b4b8bdaSRobert Mustacchi                    Big-Endian
993b4b8bdaSRobert Mustacchi
1003b4b8bdaSRobert Mustacchi                ++------++------++
1013b4b8bdaSRobert Mustacchi                || 0x12 || 0x34 ||
1023b4b8bdaSRobert Mustacchi                ++------++------++
1033b4b8bdaSRobert Mustacchi                    ^^      ^^
1043b4b8bdaSRobert Mustacchi                  0x100   0x101
1053b4b8bdaSRobert Mustacchi                    vv      vv
1063b4b8bdaSRobert Mustacchi                ++------++------++
1073b4b8bdaSRobert Mustacchi                || 0x34 || 0x12 ||
1083b4b8bdaSRobert Mustacchi                ++------++------++
1093b4b8bdaSRobert Mustacchi
1103b4b8bdaSRobert Mustacchi                   Little-Endian
1113b4b8bdaSRobert Mustacchi.Ed
1123b4b8bdaSRobert Mustacchi.Pp
1133b4b8bdaSRobert MustacchiThis example shows how an eight byte number, 0xBADCAFEDEADBEEF is stored
1143b4b8bdaSRobert Mustacchiin both big and little-endian:
1153b4b8bdaSRobert Mustacchi.Bd -literal
1163b4b8bdaSRobert Mustacchi                        Big-Endian
1173b4b8bdaSRobert Mustacchi
1183b4b8bdaSRobert Mustacchi    +------+------+------+------+------+------+------+------+
1193b4b8bdaSRobert Mustacchi    | 0xBA | 0xDC | 0xAF | 0xFE | 0xDE | 0xAD | 0xBE | 0xEF |
1203b4b8bdaSRobert Mustacchi    +------+------+------+------+------+------+------+------+
1213b4b8bdaSRobert Mustacchi       ^^     ^^     ^^     ^^     ^^     ^^     ^^     ^^
1223b4b8bdaSRobert Mustacchi     0x100  0x101  0x102  0x103  0x104  0x105  0x106  0x107
1233b4b8bdaSRobert Mustacchi       vv     vv     vv     vv     vv     vv     vv     vv
1243b4b8bdaSRobert Mustacchi    +------+------+------+------+------+------+------+------+
1253b4b8bdaSRobert Mustacchi    | 0xEF | 0xBE | 0xAD | 0xDE | 0xFE | 0xAF | 0xDC | 0xBA |
1263b4b8bdaSRobert Mustacchi    +------+------+------+------+------+------+------+------+
1273b4b8bdaSRobert Mustacchi
1283b4b8bdaSRobert Mustacchi                       Little-Endian
1293b4b8bdaSRobert Mustacchi
1303b4b8bdaSRobert Mustacchi.Ed
1313b4b8bdaSRobert Mustacchi.Pp
1323b4b8bdaSRobert MustacchiThe treatment of different endian values would not be complete without
1333b4b8bdaSRobert Mustacchidiscussing
1343b4b8bdaSRobert Mustacchi.Em PDP-endian ,
1353b4b8bdaSRobert Mustacchiwhich is also known as
1363b4b8bdaSRobert Mustacchi.Em middle-endian .
1373b4b8bdaSRobert MustacchiWhile the PDP-11 was a 16-bit little-endian system, it laid out 32-bit
1383b4b8bdaSRobert Mustacchivalues in a different way from current little-endian systems. First, it
1393b4b8bdaSRobert Mustacchiwould divide a 32-bit number into two 16-bit numbers. Each 16-bit number
1403b4b8bdaSRobert Mustacchiwould be stored in little-endian; however, the two 16-bit words would be
1413b4b8bdaSRobert Mustacchistored with the larger 16-bit word appearing first in memory, followed
1423b4b8bdaSRobert Mustacchiby the latter.
1433b4b8bdaSRobert Mustacchi.Pp
1443b4b8bdaSRobert MustacchiThe following image illustrates PDP-endian and compares it against
1453b4b8bdaSRobert Mustacchilittle-endian values. Here, we'll start with the value 0xAABBCCDD and
1463b4b8bdaSRobert Mustacchishow how the four bytes for it will be laid out, starting at 0x100.
1473b4b8bdaSRobert Mustacchi.Bd -literal
1483b4b8bdaSRobert Mustacchi                    PDP-Endian
1493b4b8bdaSRobert Mustacchi
1503b4b8bdaSRobert Mustacchi        ++------++------++------++------++
1513b4b8bdaSRobert Mustacchi        || 0xBB || 0xAA || 0xDD || 0xCC ||
1523b4b8bdaSRobert Mustacchi        ++------++------++------++------++
1533b4b8bdaSRobert Mustacchi            ^^      ^^      ^^      ^^
1543b4b8bdaSRobert Mustacchi          0x100   0x101   0x102   0x103
1553b4b8bdaSRobert Mustacchi            vv      vv      vv      vv
1563b4b8bdaSRobert Mustacchi        ++------++------++------++------++
1573b4b8bdaSRobert Mustacchi        || 0xDD || 0xCC || 0xBB || 0xAA ||
1583b4b8bdaSRobert Mustacchi        ++------++------++------++------++
1593b4b8bdaSRobert Mustacchi
1603b4b8bdaSRobert Mustacchi                  Little-Endian
1613b4b8bdaSRobert Mustacchi
1623b4b8bdaSRobert Mustacchi.Ed
1633b4b8bdaSRobert Mustacchi.Ss Network Byte Order
1643b4b8bdaSRobert MustacchiThe term 'network byte order' refers to big-endian ordering, and
1653b4b8bdaSRobert Mustacchioriginates from the IEEE. Early disagreements over which byte ordering
1663b4b8bdaSRobert Mustacchito use for network traffic prompted RFC1700 to define that all
1673b4b8bdaSRobert MustacchiIETF-specified network protocols use big-endian ordering unless noted
1683b4b8bdaSRobert Mustacchiexplicitly otherwise. The Internet protocol family (IP, and thus TCP and
1693b4b8bdaSRobert MustacchiUDP etc) particularly adhere to this convention.
1703b4b8bdaSRobert Mustacchi.Ss Determining the System's Byte Order
1713b4b8bdaSRobert MustacchiThe operating system supports both big-endian and little-endian CPUs. To
1723b4b8bdaSRobert Mustacchimake it easier for programs to determine the endianness of the
1733b4b8bdaSRobert Mustacchiplatform they are being compiled for, functions and macro constants are
1743b4b8bdaSRobert Mustacchiprovided in the system header files.
1753b4b8bdaSRobert Mustacchi.Pp
1763b4b8bdaSRobert MustacchiThe endianness of the system can be obtained by including the header
1773b4b8bdaSRobert Mustacchi.In sys/types.h
1783b4b8bdaSRobert Mustacchiand using the pre-processor macros
1793b4b8bdaSRobert Mustacchi.Sy _LITTLE_ENDIAN
1803b4b8bdaSRobert Mustacchiand
1813b4b8bdaSRobert Mustacchi.Sy _BIG_ENDIAN .
1823b4b8bdaSRobert MustacchiSee
1833b4b8bdaSRobert Mustacchi.Xr types.h 3HEAD
1843b4b8bdaSRobert Mustacchifor more information.
1853b4b8bdaSRobert Mustacchi.Pp
1863b4b8bdaSRobert MustacchiAdditionally, the header
1873b4b8bdaSRobert Mustacchi.In endian.h
1883b4b8bdaSRobert Mustacchidefines an alternative means for determining the endianness of the
1893b4b8bdaSRobert Mustacchicurrent system. See
1903b4b8bdaSRobert Mustacchi.Xr endian.h 3HEAD
1913b4b8bdaSRobert Mustacchifor more information.
1923b4b8bdaSRobert Mustacchi.Pp
1933b4b8bdaSRobert Mustacchiillumos runs on both big- and little-endian systems. When writing
1943b4b8bdaSRobert Mustacchisoftware for which the endianness is important, one must always check
1953b4b8bdaSRobert Mustacchithe byte order and convert it appropriately.
1963b4b8bdaSRobert Mustacchi.Ss Converting Between Byte Orders
1973b4b8bdaSRobert MustacchiThe system provides two different sets of functions to convert values
1983b4b8bdaSRobert Mustacchibetween big-endian and little-endian. They are defined in
1993b4b8bdaSRobert Mustacchi.Xr byteorder 3C
2003b4b8bdaSRobert Mustacchiand
2013b4b8bdaSRobert Mustacchi.Xr endian 3C .
2023b4b8bdaSRobert Mustacchi.Pp
2033b4b8bdaSRobert MustacchiThe
2043b4b8bdaSRobert Mustacchi.Xr byteorder 3SOCKET
2053b4b8bdaSRobert Mustacchifamily of functions convert data between the host's native byte order
2063b4b8bdaSRobert Mustacchiand big- or little-endian.
2073b4b8bdaSRobert MustacchiThe functions operate on either 16-bit, 32-bit, or 64-bit values.
2083b4b8bdaSRobert MustacchiFunctions that convert from network byte order to the host's byte order
2093b4b8bdaSRobert Mustacchistart with the string
2103b4b8bdaSRobert Mustacchi.Sy ntoh ,
2113b4b8bdaSRobert Mustacchiwhile functions which convert from the host's byte order to network byte
2123b4b8bdaSRobert Mustacchiorder, begin with
2133b4b8bdaSRobert Mustacchi.Sy hton .
2143b4b8bdaSRobert MustacchiFor example, to convert a 32-bit value, a long, from network byte order
2153b4b8bdaSRobert Mustacchito the host's, one would use the function
2163b4b8bdaSRobert Mustacchi.Xr ntohl 3SOCKET .
2173b4b8bdaSRobert Mustacchi.Pp
2183b4b8bdaSRobert MustacchiThese functions have been standardized by POSIX. However, the 64-bit variants,
2193b4b8bdaSRobert Mustacchi.Xr ntohll 3SOCKET
2203b4b8bdaSRobert Mustacchiand
2213b4b8bdaSRobert Mustacchi.Xr htonll 3SOCKET
2223b4b8bdaSRobert Mustacchiare not standardized and may not be found on other systems. For more
2233b4b8bdaSRobert Mustacchiinformation on these functions, see
2243b4b8bdaSRobert Mustacchi.Xr byteorder 3SOCKET .
2253b4b8bdaSRobert Mustacchi.Pp
2263b4b8bdaSRobert MustacchiThe second family of functions,
2273b4b8bdaSRobert Mustacchi.Xr endian 3C ,
2283b4b8bdaSRobert Mustacchiprovide a means to convert between the host's byte order
2293b4b8bdaSRobert Mustacchiand big-endian and little-endian specifically. While these functions are
2303b4b8bdaSRobert Mustacchisimilar to those in
2313b4b8bdaSRobert Mustacchi.Xr byteorder 3C ,
2323b4b8bdaSRobert Mustacchithey more explicitly cover different data conversions. Like them, these
2333b4b8bdaSRobert Mustacchifunctions operate on either 16-bit, 32-bit, or 64-bit values. When
2343b4b8bdaSRobert Mustacchiconverting from big-endian, to the host's endianness, the functions
2353b4b8bdaSRobert Mustacchibegin with
2363b4b8bdaSRobert Mustacchi.Sy betoh .
2373b4b8bdaSRobert MustacchiIf instead, one is converting data from the host's native endianness to
2383b4b8bdaSRobert Mustacchianother, then it starts with
2393b4b8bdaSRobert Mustacchi.Sy htobe .
2403b4b8bdaSRobert MustacchiWhen working with little-endian data, the prefixes
2413b4b8bdaSRobert Mustacchi.Sy letoh
2423b4b8bdaSRobert Mustacchiand
2433b4b8bdaSRobert Mustacchi.Sy htole
2443b4b8bdaSRobert Mustacchiconvert little-endian data to the host's endianness and from the host's
2453b4b8bdaSRobert Mustacchito little-endian respectively.
2463b4b8bdaSRobert Mustacchi.Pp
2473b4b8bdaSRobert MustacchiThese functions
2483b4b8bdaSRobert Mustacchiare not standardized and the header they appear in varies between the
2493b4b8bdaSRobert MustacchiBSDs and GNU/Linux. Applications that wish to be portable, should
2503b4b8bdaSRobert Mustacchiinstead use the
2513b4b8bdaSRobert Mustacchi.Xr byteorder 3C
2523b4b8bdaSRobert Mustacchifunctions.
2533b4b8bdaSRobert Mustacchi.Pp
2543b4b8bdaSRobert MustacchiAll of these functions in both families simply return their input when
2553b4b8bdaSRobert Mustacchithe host's native byte order is the same as the desired order. For
2563b4b8bdaSRobert Mustacchiexample, when calling
2573b4b8bdaSRobert Mustacchi.Xr htonl 3SOCKET
2583b4b8bdaSRobert Mustacchion a big-endian system the original data is returned with no conversion
2593b4b8bdaSRobert Mustacchior modification.
2603b4b8bdaSRobert Mustacchi.Sh SEE ALSO
2613b4b8bdaSRobert Mustacchi.Xr endian 3C ,
2623b4b8bdaSRobert Mustacchi.Xr endian.h 3HEAD ,
2633b4b8bdaSRobert Mustacchi.Xr inet 3HEAD ,
2643b4b8bdaSRobert Mustacchi.Xr byteorder 3SOCKET
265