bytes to hex and vice versa


구글에서 “byte hex” 이렇게 두 단어만 검색해보자.

byte[]와 hex로 다시 hex를 byte[]로 변환하는 내용의 블로그 엔트리가 주르륵 흘러 나온다.

검색 결과 중 몇몇 한글 블로그를 보던 중 이상한 부분이 눈에 들어왔다.

일단 Integer.toString(int, int)Integer.parseInt(String, int) 를 사용하는 방법은, 뭐, 틀린 방법은 아니다. (하지만 이 역시 좋은 방법은 아니다. Java 개발자들이 C 개발자들한테 까이는 이유 중에 하나일 수도 있다. 이 짓꺼리 하나 하는데 String 객체를 도데체 몇 개를 만들고 날리는가?)

근데 쌩뚱맞게시리 BigInteger를 사용하면 한 줄로 해결 할 수 있다는 글-귀(but 鬼, not 句)가 보인다.

이걸 어떤 천재(天災)가 처음에 썼는지, 그걸 또 다른 누군가가 아무 생각도 없이 가져다가 뿌려댔는지, 는 잘 모르겠다.

대략 내용은 다음과 같다.


// decoding?
byte[] bytes = new BigInteger(hexText, 16).toByteArray();

// encoding?
String hexText = new BigInteger(bytes).toString(16);

깔끔한 코드에 한표를 던지고 싶네요.. ^^

덕분에 해결했습니다 ^^

다음 단위 테스트를 보자.

public class WrongBigIntegerForHexTest {

    @Test
    public void seemsWork() {
        final byte[] expected = new byte[]{0x09, 0x1A};
        final String encoded = new BigInteger(expected).toString(16);
        Assert.assertEquals(encoded, "91a");
        final byte[] actual = new BigInteger(encoded, 16).toByteArray();
        Assert.assertEquals(actual, expected);
    }

    @Test
    public void seemsWorkHuh() {
        final byte[] expected = new byte[]{0x00, 0x09, 0x1A};
        final String encoded = new BigInteger(expected).toString(16);
        final byte[] actual = new BigInteger(encoded, 16).toByteArray();
        Assert.assertNotEquals(actual, expected);
    }

    @Test(expectedExceptions = NumberFormatException.class)
    public void encodeFail() {
        new BigInteger(new byte[0]).toString(16);
    }

    @Test(expectedExceptions = NumberFormatException.class)
    public void decodeFail() {
        new BigInteger("", 16).toByteArray();
    }
}

뭐, 그렇다는 거다.

여기 매우 버보스 하고 일부 불필요한 코드 까지 겸비한 소스가 있다. 찍어드삼.

HexEncoder.java
HexDecoder.java

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s