code

XML 문서에서 인터넷을 통해 바이너리 콘텐츠를 보내기위한 Base64 대 HEX

codestyles 2020. 12. 28. 08:10
반응형

XML 문서에서 인터넷을 통해 바이너리 콘텐츠를 보내기위한 Base64 대 HEX


XML 문서 내에서 시스템간에 바이너리 콘텐츠를 보내는 가장 좋은 방법은 무엇입니까?

나는 Base64와 Hex에 대해 알고 있습니다. 실제 차이점은 무엇입니까? 나는 현재 Base64를 사용하고 있지만 HEX와 마찬가지로 함수를 만들 수 있다고 생각하는 외부 공용 라이브러리를 포함해야합니다.


Base64에 대한 자체 메서드도 작성할 수 있지만 일반적으로 둘 다에 대해 잘 테스트 된 외부 라이브러리를 사용하는 것이 좋습니다. (그것이 부족한 것이 아닙니다.)

Base64와 hex의 차이점은 실제로 바이트가 표현되는 방식입니다. Hex는 "Base16"을 말하는 또 다른 방법입니다. Hex는 각 바이트에 대해 2 개의 문자를 사용합니다. Base64는 3 바이트마다 4 개의 문자를 사용하므로 16 진수보다 효율적입니다. XML 문서를 인코딩하는 데 UTF-8을 사용한다고 가정하면 100K 파일은 16 진수로 인코딩하는 데 200K, Base64에서는 133K가 필요합니다. 물론 공간 효율성에 관심이 없을 수도 있습니다. 대부분의 경우 중요하지 않습니다. 이 경우 않는 문제, 다음 명확하게 Base64로는 전면에 좋습니다. (더 효율적인 대안이 있지만 그다지 일반적이지 않습니다.)


두 가지 '실제 차이점'만 있습니다.

  1. 기수. Base64는 base-64, 놀람, hex는 base-16입니다.

  2. 인코딩 : base-64는 3 개의 소스 바이트를 4 개의 base-64 문자로 인코딩합니다 ( http://en.wikipedia.org/wiki/Base64#Examples ). hex는 1 바이트를 2 개의 16 진수 문자로 인코딩합니다.

따라서 base64는 hex보다 더 작습니다.


다른 답변은 base16과 base64의 효율성 차이를 명확히했습니다.

기본 선택에는 효율성보다 더 많은 것이 있습니다.

Base64는 문자와 숫자 이상의 것을 사용합니다. 다른 구현 에서는 패딩을 표시하고 64 세트의 마지막 두 문자를 구성 하기 위해 다른 구두점 문자를 사용합니다. 여기에는 더하기 "+"및 같음 "="이 포함될 수 있습니다. 둘 다 HTTP 쿼리 문자열에서 문제가 있습니다.

따라서 base64보다 base16을 선호하는 한 가지 이유는 base16 값을 추가 인코딩없이 HTTP 쿼리 문자열로 직접 구성 할 수 있다는 것입니다. 그게 당신에게 중요합니까?

이것은 효율성에 대한 추가적인 관심사입니다. 두 염기 모두 본질적으로 더 좋거나 나쁘지는 않습니다. 그것들은 척도에서 단지 두 개의 다른 지점 일 뿐이며, 다른 상황에서 다소 매력적일 다른 속성을 찾을 수 있습니다.

예를 들어 base32를 고려 하십시오 . base64보다 20 % 덜 효율적이지만 여전히 HTTP 쿼리 문자열에 사용하기에 적합합니다. 대부분의 비 효율성은 대소 문자를 구분하지 않고 0 "0"과 1 "1"을 피하는 것에서부터 인간에 의한 번식 실수에 기인합니다.

따라서 base32는 새로운 관심사를 소개합니다. 인간의 번식 용이성. 그게 당신의 걱정입니까? 그렇지 않은 경우 HTTP 쿼리 문자열에서 여전히 편리하지만 대소 문자를 구분하며 0 "0"과 "1"을 포함하는 base62와 같은 것을 사용할 수 있습니다.

바라건대, 나는 당신에게 중요한 것을 희생하기 전에 당신이 가질 수있는 최고의 효율성을 얻을 때까지 당신의 인코딩베이스를 선택하는 것은 스케일을 따라 미끄러지는 문제라는 것을 명확히했습니다.

Wikipedia에는 ​​재미있는 숫자 체계 목록이 있습니다 .


나는 EARTH base64에서 33 %의 공간 증가를 위해 3 개의 입력 바이트를 4 개의 출력 바이트로 변환 할 수있는 방법이 궁금했습니다 (반면 16 진수는 100 % 공간 증가를 위해 1 개의 입력 바이트를 2 개의 출력 바이트로 변환). 왜 특별히 입력 바이트가 3 개입니까?

정답은:

3 바이트 = 3 x 8 비트 = 24 비트.

왜 마법의 "24 비트"숫자일까요? 음, 64 진법은 0에서 63까지의 숫자를 나타냅니다. 이진법은 어떻게 표현됩니까? 000000 (0)에서 111111 (63)까지.

빙고! 각 base64 문자는 단일 출력 바이트 ( "Z"등의 단일 문자)를 사용하여 6 비트의 입력 데이터를 나타냅니다.

따라서 24 비트 (3 개의 완전한 8 비트 입력 바이트) / 6 비트 (base64 알파벳) = 4 바이트의 base64입니다. 그게 다야!

"왜 base128 (입력 7 비트 = 출력 8 비트), 인코딩 할 때 크기가 14 % 증가하지 않는가?"라고 생각할 수 있습니다. 이에 대한 대답은 base64가 우리가 찾을 수있는 가장 좋은 방법이라는 것입니다. 하위 128 개의 ASCII 문자가 모두 인쇄 가능한 것은 아니기 때문입니다. 대부분은 NULL 등과 같은 제어 문자입니다.

사용자 지정 인코딩 알고리즘을 만들면 원하는 모든 작업을 수행 할 수 있기 때문에 "base81"등과 같은 다른 시스템을 만드는 방법이 분명히 있습니다. 그러나 base64의 장점은 데이터를 6 비트 단위로 깔끔하게 인코딩하는 방법입니다. 그래서 그 인코딩 체계가 대중화되었습니다.

이제 당신은 이것을 읽은 후 더 현명 해졌습니다.


base64는 오버 헤드가 적습니다 (base64는 원본 데이터의 3 바이트마다 4 개의 문자를 생성하는 반면 16 진수는 원본 데이터의 모든 바이트에 대해 2 개의 문자를 생성 함). Hex는 더 읽기 쉽습니다. 두 문자 만보고 뒤에 어떤 바이트가 있는지 즉시 알 수 있지만 base64에서는 4 자 그룹을 디코딩하는 데 노력이 필요하므로 16 진수를 사용하면 디버깅이 더 쉬워집니다.


크기가 당신에게 중요합니까?

Base64는 공간 효율적입니다. 4 문자를 사용하여 3 바이트를 나타내며 16 진수는 각 바이트에 2 문자를 사용합니다. 즉, hex는 문자열의 크기를 100 % 증가시킵니다. URL 요청의 매개 변수로 맞는 작은 문자열의 경우 추가 비용 / 크기에 신경 쓰지 않습니다.

사용 편의성이 중요합니까?

진수는 당신이 (이 포함될 수 있습니다 탈출 할 필요가 없기 때문에 Base64로보다 사용하기 쉽게 +, =그리고 /URL 요청에 GET 매개 변수로 문자열을 사용하는 경우).

광범위한 사용이 중요합니까?

나는 숫자가 없지만 몇 가지 요인에 따라 Base64가 16 진수보다 일반 개발자에게 더 잘 알려질 수 있습니다. 나는 hex (base16)보다 오래 전에 base64에 대해 알고있었습니다.

참조 URL : https://stackoverflow.com/questions/3183841/base64-vs-hex-for-sending-binary-content-over-the-internet-in-xml-doc

반응형