Endianness defines the location of byte 0 within a larger data structure.

Little-endian

The least significant byte of a 16-bit value is sent or stored before the most significant byte

Bits7:0 | Bits15:8

A 32bit value is stored in a byte array as:

Byte[3] | Byte[2] | Byte[1] | Byte[0]

Big-endian

The more significant byte of a 16-bit value is sent or stored before the less significant byte

Bits15:8 | Bits7:0

A 32bit value is stored in a byte array as:

Byte[0] | Byte[1] | Byte[2] | Byte[3]

Endian usage

Windows – Little endian

Modbus – Big Endian

Little Endian

UInt32 conversion

UInt16[1] | UInt16[0]

UInt64 conversion

UInt16[3] | UInt16[2] | UInt16[1] | UInt16[0]

Big Endian

UInt32 conversion

UInt16[0] | UInt16[1]

UInt64 conversion

UInt16[0] | UInt16[1] | UInt16[2] | UInt16[3]

Float conversion

UInt16[0] | UInt16[1]


	//Converting big endian modbus registers to float on little endian windows (ModbusRegisterValues[0] was received first)
	array<Byte>^byteArray = gcnew array<Byte>(4);
	byteArray[3] = (Byte)(ModbusRegisterValues[0] >> 8);
	byteArray[2] = (Byte)(ModbusRegisterValues[0] & 0x00ff);
	byteArray[1] = (Byte)(ModbusRegisterValues[1] >> 8);
	byteArray[0] = (Byte)(ModbusRegisterValues[1] & 0x00ff);
	float my_float = BitConverter::ToSingle(byteArray, 0);

	//Converting float on little endian windows to big endian modbus registers (ModbusRegisterValues[0] will be sent first)
	ModbusRegisterValues = gcnew array <UInt16>(2);
	array<Byte>^byteArray = BitConverter::GetBytes(my_float_value);
	ModbusRegisterValues[0] = ((UInt16)byteArray[3] << 8) | ((UInt16)byteArray[2]);		//Converting float on little endian windows to big endian modbus registers
	ModbusRegisterValues[1] = ((UInt16)byteArray[1] << 8) | ((UInt16)byteArray[0]);