0% found this document useful (0 votes)
679 views3 pages

Byte Ordering Functions

This document discusses byte ordering when storing multi-byte integers in memory and across networks. There are two common byte orders - little endian and big endian - and files may be stored in either format depending on the system. Network protocols use big endian ordering. The document also introduces functions like htons() and ntohl() to convert between host byte order and big endian network byte order when transmitting across networks.

Uploaded by

Dinesh Kumar
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
679 views3 pages

Byte Ordering Functions

This document discusses byte ordering when storing multi-byte integers in memory and across networks. There are two common byte orders - little endian and big endian - and files may be stored in either format depending on the system. Network protocols use big endian ordering. The document also introduces functions like htons() and ntohl() to convert between host byte order and big endian network byte order when transmitting across networks.

Uploaded by

Dinesh Kumar
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 3

Byte Ordering Functions To store a 16-bit integer that is made up of 2 bytes, there are two ways to store that

two bytes in memory: with the low-order byte at the starting address, known as little-endian byte order, or with the high-order byte at the starting address, known as big-endian byte order. Page | 1

There is no standard between these two byte orderings and we encounter systems that use both formats. A general byte order is used called host byte order. The program shown in Figure 3.10 prints the host byte order. Figure 3.10 Program to determine host byte order. intro/byteorder.c 1 #include "unp.h"

2 int 3 main(int argc, char **argv) 4{ 5 union { 6 short s; 7 char c[sizeof(short)]; 8 } un; 9 un.s = 0x0102; //two bytes of 16-bit integer 10 printf("%s: ", CPU_VENDOR_OS); 11 if (sizeof(short) == 2) {

12 if (un.c[0] == 1 && un.c[1] == 2) 13 printf("big-endian\n"); 14 else if (un.c[0] == 2 && un.c[1] == 1) 15 printf("little-endian\n"); 16 else 17 printf("unknown\n"); 18 } else 19 printf("sizeof(short) = %d\n", sizeof(short)); 20 exit(0); 21 } The string CPU_VENDOR_OS is determined by the GNU autoconf program and it identifies the CPU type, vendor, and OS release. Examples: freebsd4 % byteorder i386-unknown-freebsd4.8: little-endian macosx % byteorder powerpc-apple-darwin6.6: big-endian The same applies to 32-bit integer. Network Byte Order: 1. In a TCP segment, there is a 16-bit port number and a 32-bit IPv4 address. 2. The sending protocol stack and the receiving protocol stack must agree on the order in which the bytes of these multibyte fields will be transmitted. 3. The Internet protocols use big-endian byte ordering for these multibyte integers. 4. The implementation stores the fields in a socket address structure in host byte order and then convert to and from the network byte order when moving the fields to and from the protocol headers. Four functions to convert between these two byte orders: #include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue) ; uint32_t htonl(uint32_t host32bitvalue) ;

Page | 2

Both return: value in network byte order uint16_t ntohs(uint16_t net16bitvalue) ; uint32_t ntohl(uint32_t net32bitvalue) ;
Page | 3

Both return: value in host byte order Another important convention in Internet standards is bit ordering. In many Internet standards. Packet Format:

-To make it easier to read protocol definitions in RFCs.

You might also like