λ°”μ΄νŠΈ μˆœμ„œ(Byte Order)λŠ” 였래 μ „ μ»΄ν“¨ν„°κ³΅ν•™κ³Όμ—μ„œ λ°°μ› λ˜ κ°œλ…μ΄μ§€λ§Œ μ‹€λ¬΄μ—μ„œλŠ” μ‹€μ œλ‘œ κ³ λ €ν•  ν•„μš”κ°€ μ—†μ—ˆλ‹€.

μ»΄ν“¨ν„°μ—μ„œ 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯ν•  λ•Œμ˜ λ°”μ΄νŠΈ μˆœμ„œλŠ” λΉ… μ—”λ””μ•ˆκ³Ό 리틀 μ—”λ””λ°© μ‹μœΌλ‘œ λ‚˜λˆ„μ–΄μ§€λŠ”λ° 이것은 CPU μ•„ν‚€ν…μ²˜μ— 따라 λ‚˜λˆ„μ–΄μ§„λ‹€κ³  ν•œλ‹€. TCP λ„€νŠΈμ›Œν¬ μŠ€νŽ™ μƒμ—λŠ” νŒ¨ν‚·μ˜ λ°”μ΄νŠΈ μˆœμ„œλŠ” λΉ… μ—”λ””μ•ˆμœΌλ‘œ κ΅¬μ„±λ˜λ©° μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 자주 ν™œμš©λ˜λŠ” 언어인 μžλ°”λ„ 이λ₯Ό κ°μ•ˆν•˜μ—¬ λΉ… μ—”λ””μ•ˆμ„ 기본적으둜 μ‚¬μš©ν•œλ‹€. CPU μ•„ν‚€ν…μ²˜μ™€ λ‹€λ₯΄κ²Œ λΉ… μ—”λ””μ•ˆμœΌλ‘œ μ‚¬μš©λ˜λŠ” μ΄μœ λŠ” JVM μ΄λΌλŠ” λ³„λ„μ˜ μŠ€νƒμ„ 기반으둜 κ΅¬λ™λ˜κΈ° λ•Œλ¬Έμ΄λΌκ³  ν•œλ‹€. κ·ΈλŸ¬λ‚˜, SCADA λ˜λŠ” PLC μž₯비와 같은 일뢀 μ‹œμŠ€ν…œμ—μ„œλŠ” λΉ… μ—”λ””μ•ˆ 방식이 μ•„λ‹Œ 리틀 μ—”λ””μ•ˆ λ˜λŠ” λ―Έλ“œ 리틀 μ—”λ””μ•ˆμœΌλ‘œ λ°”μ΄νŠΈ μˆœμ„œλ₯Ό κ΅¬μ„±ν•˜κ³  μžˆλŠ”λ° μ΄λŸ¬ν•œ μ‹œμŠ€ν…œμ€ C μ–Έμ–΄λ₯Ό 기반으둜 λ§Œλ“€μ–΄μ§€κΈ° λ•Œλ¬Έμ΄λ‹€.

일반적인 μžλ°” μ›Ή κ°œλ°œμžλ“€μ΄ λ°”μ΄νŠΈ μˆœμ„œλ₯Ό κ³ λ €ν•˜μ—¬ λΉ„νŠΈ μ—°μ‚° λ˜λŠ” μ‹œν”„νŠΈ 연산을 μˆ˜ν–‰ν•  κ²½μš°λŠ” λ§Žμ§€ μ•Šμ„ 것 κ°™λ‹€.

Mid Little Endian, MLE

λΉ… μ—”λ””μ•ˆμ™€ 리틀 μ—”λ””μ•ˆ 뿐만 μ•„λ‹ˆλΌ λ°”μ΄νŠΈ μˆœμ„œλ₯Ό μŠ€μ™‘ν•˜λŠ” λ―Έλ“œ 리틀 μ—”λ””μ•ˆμ€ AB CD의 λ°”μ΄νŠΈ μˆœμ„œκ°€ μžˆμ„λ•Œ CD AB둜 ν‘œν˜„ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 32λΉ„νŠΈλ‘œ κ΅¬μ„±λ˜λŠ” Float ν˜•μ‹μ„ λ―Έλ“œ 리틀 μ—”λ””μ•ˆ λ°©μ‹μœΌλ‘œ κ΅¬μ„±ν•œ 것을 Float32MLE 이라고 ν‘œκΈ°ν•  수 μžˆλ‹€.

Base Convert: IEEE 754 Floating Point

Float32MLE Example

@DisplayName("Endian Test")
class EndianTest {

    @DisplayName("Float32 Mid Little Endian")
    @Test
    void TestFloat32MLE() {
        String hexadecimal = "00004260"; // 00 00 42 60
        byte[] bytes = HexFormat.of().parseHex(hexadecimal);
        float originValue = PooledByteBufAllocator.DEFAULT.buffer()
                .writeBytes(new byte[]{bytes[2], bytes[3]}) // CD (42 60)
                .writeBytes(new byte[]{bytes[0], bytes[1]}) // AB (00 00)
                .readFloat();
        float value = BigDecimal.valueOf(originValue)
                .setScale(1, RoundingMode.HALF_UP)
                .floatValue();
        Assertions.assertEquals(56.0f, value);
    }

}

Netty의 ByteBuf ν΄λž˜μŠ€μ—μ„œλŠ” λΉ… μ—”λ””μ•ˆ λ°©μ‹μ˜ readFloat ν•¨μˆ˜μ™€ 리틀 μ—”λ””μ•ˆ λ°©μ‹μ˜ readFloatLE ν•¨μˆ˜λ₯Ό μ œκ³΅ν•˜κ³  μžˆλ‹€. κ·ΈλŸ¬λ‚˜, λ―Έλ“œ 리틀 μ—”λ””μ•ˆ λ°©μ‹μ˜ κ²½μš°μ—λŠ” λ³„λ„λ‘œ μ œκ³΅ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ μœ„μ™€ 같이 버퍼에 CD AB 순으둜 μ“°κ³ λ‚˜μ„œ λΉ… μ—”λ””μ•ˆ λ°©μ‹μœΌλ‘œ μ½μ–΄μ•Όν•œλ‹€.