Skip to content

๋ฐ”์ดํŠธ ์ˆœ์„œ(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 โ€‹

java
@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 ์ˆœ์œผ๋กœ ์“ฐ๊ณ ๋‚˜์„œ ๋น… ์—”๋””์•ˆ ๋ฐฉ์‹์œผ๋กœ ์ฝ์–ด์•ผํ•œ๋‹ค.

Released under the MIT License.