ByteOrder

ByteOrder is a final class that defines byte ordering—endianness—used when reading or writing multibyte data types (like int, float, etc.) into a ByteBuffer.

What is Byte Order?

Byte order (endianness) refers to the order in which bytes are stored in memory:

  • Big-endian: Most significant byte is stored first.
  • Little-endian: Least significant byte is stored first.

Java uses big-endian by default.

Commonly Used Methods

Simple Java Program using ByteOrder

Show how to check and print the platform’s native byte order.

import java.nio.ByteOrder;

public class SimpleByteOrderExample {
    public static void main(String[] args) {
        ByteOrder order = ByteOrder.nativeOrder();
        System.out.println("Native Byte Order of this machine: " + order);
    }
}
/*
Native Byte Order of this machine: LITTLE_ENDIAN
*/

Problem Statement (With LotusJavaPrince and Mahesh):

LotusJavaPrince is designing a cross-platform file exchange system. Mahesh is in charge of implementing a buffer handler that must store integers in little-endian format even if the platform is big-endian. The task is to use ByteBuffer with the correct ByteOrder so that the integer is stored in little-endian format and read back correctly.

Solution: Use ByteBuffer.order(ByteOrder.LITTLE_ENDIAN) to set the byte order explicitly.

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class ByteOrderCaseStudy {
    public static void main(String[] args) {
        int value = 0x12345678;

        // Default buffer (big-endian)
        ByteBuffer bigEndianBuffer = ByteBuffer.allocate(4);
        bigEndianBuffer.putInt(value);
        byte[] bigEndianBytes = bigEndianBuffer.array();

        // Little-endian buffer
        ByteBuffer littleEndianBuffer = ByteBuffer.allocate(4);
        littleEndianBuffer.order(ByteOrder.LITTLE_ENDIAN);
        littleEndianBuffer.putInt(value);
        byte[] littleEndianBytes = littleEndianBuffer.array();

        // Print bytes for both
        System.out.println("Big-Endian Bytes:");
        for (byte b : bigEndianBytes) {
            System.out.printf("%02X ", b);
        }

        System.out.println("\nLittle-Endian Bytes:");
        for (byte b : littleEndianBytes) {
            System.out.printf("%02X ", b);
        }

        // Now read the value back from little-endian buffer
        ByteBuffer readBuffer = ByteBuffer.wrap(littleEndianBytes);
        readBuffer.order(ByteOrder.LITTLE_ENDIAN);
        int readValue = readBuffer.getInt();
        System.out.println("\nRead back value: 0x" + Integer.toHexString(readValue).toUpperCase());
    }
}

Output

Big-Endian Bytes:
12 34 56 78 
Little-Endian Bytes:
78 56 34 12 
Read back value: 0x12345678

The ByteOrder class in Java NIO is crucial for handling endianness, which determines the byte arrangement of multi-byte data types (like int, float, or long) during storage or transmission. It supports two constants:

  • ByteOrder.BIG_ENDIAN – most significant byte first,
  • ByteOrder.LITTLE_ENDIAN – least significant byte first.

This class is especially important when working with ByteBuffer and other NIO buffers, allowing developers to control how bytes are interpreted and written, particularly in cross-platform or binary file/network communication scenarios.

By setting the appropriate byte order using buffer.order(ByteOrder.LITTLE_ENDIAN), applications can ensure correct data interpretation and compatibility with external systems that follow specific byte orders.

Scroll to Top