home icon Kha Research Blog
GithubTwitter

How to Detect Byte Order in Go

The native package contains a method for detecting byte order in Go. While this can sometimes lead to program portability issues, understanding how the package works can greatly improve the developer experience.

Byte order, also known as endianness, refers to the way in which a computer stores the individual bytes of a multi-byte data type in its memory. Little-endian systems store the least significant byte at the lowest memory address, while big-endian systems store the most significant byte at the lowest memory address

To detect the byte order of a system when working at a low level, you can use the following snippet:

var Endian binary.ByteOrder

var IsBigEndian bool

func init() {
	b := uint16(0xff) // one byte
	if *(*byte)(unsafe.Pointer(&b)) == 0 {
		Endian = binary.BigEndian
		IsBigEndian = true
	} else {
		Endian = binary.LittleEndian
		IsBigEndian = false
	}
}

In this particular case, the 0xff value is being used as a sentinel value to detect the byte order of the system. The 0xff value is chosen because it consists of all 1 bits, which means that the most significant bit of the value will be set to 1.

In a big-endian system, the most significant byte (which in this case would be 0xff) would be stored at the lowest memory address. Therefore, if the byte pointed to by the unsafe.Pointer function is equal to 0, it means that the system is using a big-endian byte order because the 0xff value has been "truncated" to just 0x00 due to the fact that the system is only storing the least significant byte at the lowest memory address.