2017-01-18 11 views
0

이것은 아마도 간단한 대답 일지 모르지만 나는 그것을 파악하지 못하는 것 같습니다. 메시지의 Base32 섹션을 디코드하려고하지만 Apache Commons 디코더에서 기대하는 결과를 얻지 못했습니다.왜 Apache Commons Base32 디코딩은 빈 배열을 반환합니까?

base32 = new Base32(true); 
byte[] value = base32.decode(new String("F=======").getBytes()); 

값은 당신의 16 진수 = TRUE를 사용한다고 말할 부울의 생성자를 사용하는 하늘의 배열

답변

1

처음에는 질문을 완전히 오해 한 것 같습니다.

왜 Apache Commons Base32 디코딩은 빈 배열 을 반환합니까?

답변. 이것은 Apache Commons Base32 디코딩 라이브러리가 아니지만 잘 작성된 base32 디코딩 알고리즘은 빈 값을 반환합니다. 왜? base32 인코딩 알고리즘이 인코딩 결과로 "F ======="문자열을 생성하는 것은 불가능합니다.

디코딩 된 문자열 "F8 ======"의 예를 들어 base32 디코딩 알고리즘을 이해해 봅시다. "="는 실제 base32 문자가 아닙니다. 패딩에 사용됩니다. 따라서 실제 인코딩 된 문자열은 "F8"입니다.

Base32hex character map을 보면 F와 8의 십진수는 각각 15와 8이며 이진수로 각각 00001111과 00001000입니다. Base32가 의미하는 것처럼 5 비트 (32 = 2^5)의 집합으로 작동합니다. 따라서 5 비트 집합으로 그룹화 된 경우 동일한 이진수는 각각 01111 및 01000로 표현됩니다. 알고리즘에 따라 이러한 5 비트 세트는 공백없이 "01111 01000"또는 "0111101000"으로 함께 배치됩니다. 그런 다음이 숫자는 왼쪽에서 각각 "01111010 00"을 나타내는 8 비트 세트로 그룹화됩니다. 두 번째 세트는 8 비트를 모두 가지고있는 것이 아니기 때문에 불완전한 세트이므로 11 진수로 변환하면 122가되는 01111010의 값을 남겨두고 폐기됩니다. 122라는 값은 아스키 문자 'z'에 매핑됩니다. 따라서 "F8"을 해독하는 대답은 "z"입니다.

이제 패딩을 무시한 경우 "F ======="의 예에서이 알고리즘을 적용하면 불완전한 집합 인 "01111"만 설정됩니다 모든 8 비트를 가지고 있지 않기 때문입니다. 따라서 빈 값이 결과로 리턴됩니다.

0

입니다. 문자열에 16 진수 값이 없습니다. 첫 번째 줄에서는 Base32() 생성자를 사용하십시오.

+0

부울은 내가 사용하고있는 Base32hex 알파벳 (Triacontakaidecimal)을 사용하기위한 것입니다. – KDoyle

+0

나는 아파치 Commons Base32.decode 소스에 갔다. 바이트 배열을 입력으로 사용합니다. 너는 끈이있어. "F ======="를 사용하십시오. getBytes() –

+0

예. 거기 오타. 나는 편집 할 것이다. getBytes()는 여전히 빈 배열로 디코딩합니다. 캐치를 가져 주셔서 감사합니다. – KDoyle