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