BE16TOH(3) Library Functions Manual BE16TOH(3)

be16toh be32toh be64toh htobe16 htobe32 htobe64 htole16 htole32 htole64 le16toh le32toh le64tohconvert values between host and specified byte order

#include <endian.h>

uint16_t be16toh(uint16_t big_endian_16bits);
uint32_t be32toh(uint32_t big_endian_32bits);
uint64_t be64toh(uint64_t big_endian_64bits);

uint16_t htobe16(uint16_t host_16bits);
uint32_t htobe32(uint32_t host_32bits);
uint64_t htobe64(uint64_t host_64bits);

uint16_t htole16(uint16_t host_16bits);
uint32_t htole32(uint32_t host_32bits);
uint64_t htole64(uint64_t host_64bits);

uint16_t le16toh(uint16_t little_endian_16bits);
uint32_t le32toh(uint32_t little_endian_32bits);
uint64_t le64toh(uint64_t little_endian_64bits);

These functions shall convert integer values of various sizes between host representations and representations in a specified order.

On some implementations, these functions are defined as macros.

A little-endian representation of an integer has the least significant byte stored as the first byte, with the significance of the bytes increasing as the byte address increases. A big-endian representation has the most significant byte as the first byte, with the significance of the bytes reducing as the byte address increases.

Network byte order is big-endian.

For example, the value 0x01020304 is represented as the four bytes 0x04, 0x03, 0x02, 0x01 on a little-endian host, and as 0x01, 0x02, 0x03, 0x04 on a big-endian host.

For each of the sizes 16, 32 and 64, the () function shall convert from whatever order the host uses to big-endian representation, () shall convert to little-endian representation, () shall convert from big-endian to host order, and () shall convert from little-endian to host order.

These functions shall return an unsigned integer of the appropriate size and representation.

No errors are defined.

#include <endian.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    uint32_t val;


    if (argc > 1) {
        val = (uint32_t)strtoul(argv[1], NULL, 0);
        printf("Value: %08x\n", val);


        printf("As bytes:\n");
        union {
            uint32_t asint;
            unsigned char asbytes[sizeof(uint32_t)];
        } u;
        printf("Little endian: ");
        u.asint = htole32(val);
        for (int i = 0; i < sizeof(uint32_t); i++) {
            printf("%02x ", u.asbytes[i]);
        }
        printf("\n");


        printf("Big endian   : ");
        u.asint = htobe32(val);
        for (int i = 0; i < sizeof(uint32_t); i++) {
            printf("%02x ", u.asbytes[i]);
        }
        printf("\n");
    }
    return 0;
}

Since network order is defined as big-endian, the following functions are equivalent if <arpa/inet.h> is included:

<endian.h> <arpa/inet.h>
htobe32 htonl
htobe16 htons
be32toh ntohl
be16toh ntohs

None.

None.

htonl(3)

XBD <arpa/inet.h>, <endian.h>

First released in Issue 8.

June 14, 2024 posix.fail