2010-06-11 2 views
1

나는 자바에서이 의사 코드가 있습니다는 MD5 해시 16 진수하고 다시

bytes[] hash = MD5.hash("example"); 

String hexString = toHexString(hash); //This returns something like a0394dbe93f 

bytes[] hexBytes = hexString.getBytes("UTF-8"); 

지금, hexBytes[]hash[]가 다른합니다.

나는 hash.length()이 16이고, hexBytes.length()이 32이기 때문에 뭔가 잘못하고 있다는 것을 알고 있습니다. 문자가 유니 코드 인 경우 자바와 관련이 있습니다.

어쨌든 질문은 : 원래 hash[] 배열을 hexString에서 가져 오는 방법입니다.

16 
[-24, 32, -69, 74, -70, 90, -41, 76, 90, 111, -15, -84, -95, 102, 65, -10] 
32 
[101, 56, 50, 48, 98, 98, 52, 97, 98, 97, 53, 97, 100, 55, 52, 99, 53, 97, 54, 102, 102, 49, 97, 99, 97, 49, 54, 54, 52, 49, 102, 54] 

고마워 :

당신이보고 싶을 경우 전체 코드가 여기에있다 http://gist.github.com/434466

그 코드의 출력은 (는 40 LOC ~입니다)!

답변

2

을 당신은 그냥 hexString.getBytes("UTF-8");으로 16 진수 문자열의 바이트를 받고 자신의 바이트 값으로 16 진수로 변환되지 않습니다 API가 적합하지 않습니다, 그러나 그것은 작동합니다 -

Apache Commons Codec

은 적절한 방법이있다 .

즉, toHexString 기능의 역순으로 작성해야합니다. toHexString은 10-2 자리 이하의 값을 지정해야합니다. 예 : 바이트 9는 "9"가 아니라 "09"로 끝납니다.

2

toHexString을 표시하지 않았지만 기본적으로 역의 동등한 것이 필요합니다. fromHexString 또는 이와 유사한 메소드를 찾습니다.

기본적으로 String.getBytes()은 정상 인코딩 (이 경우 UTF-8)을 수행합니다. 당신은 실제로 의 텍스트 (임의의 2 진 데이터의 텍스트 표현 임)를 byte[]으로 디코드하려고합니다.

byte[] data = ...; 
String hex = Hex.encodeHexString(data); 
... 

byte[] decoded = (byte[]) Hex.decode(hex); 
+0

그것을 할 수있는 방법은 다음과 같습니다 //gist.github .com/434466 (이름은 다를 수 있음). 감사합니다. Apache Commons를 살펴 보겠습니다. –

+0

그냥 궁금 해서요 ... API가 이상하지 않다고 말하는 이유는 무엇입니까? –

+0

@Pablo : 이상적으로는 문자열을 가져 와서 강력한 형식의 바이트 배열을 반환하는 Hex.decode 메서드가 있어야합니다. 'Object decode (Object)'서명은 짜증나게합니다. –

1

getBytes()는 16 진수를 구문 분석하지 않으므로 문자 인코딩을 처리합니다. 즉 '0A'는 0x0A로 변환되지 않고 0x30 0x41로 변환됩니다. '0'및 'A'문자가 인코딩되는 방식이기 때문입니다. 함수에 radix == 16 대신 Integer.parseInt(String, radix)을 사용하려고합니다. 당신이 라이브러리를 사용하지 않으려면

1

, 여기 당신이, 육각 디코더의 내 버전으로 코드가 내가 HTTP를 연결 요점에

byte[] hexBytes = dehexify(hexString); 

public static byte[] dehexify(String hexString) { 
    if (hexString.length()%2 == 1) 
     throw new IllegalArgumentException("Invalid length");  
    int len = hexString.length()/2; 
    byte[] bytes = new byte[len]; 
    for (int i=0; i<len; i++) { 
     int index = i*2; 
     bytes[i] = (byte)Integer.parseInt(hexString.substring(index, index+2), 16); 
    } 
    return bytes; 
} 
관련 문제