programing

XML 문서에서 인터넷을 통해 이진 컨텐츠를 전송하기 위한 Base64 대 HEX

javajsp 2023. 9. 16. 08:40

XML 문서에서 인터넷을 통해 이진 컨텐츠를 전송하기 위한 Base64 대 HEX

XML 문서 내의 시스템 간에 이진 컨텐츠를 보내는 가장 좋은 방법은 무엇입니까?

Base64와 Hex에 대해 알고 있는데, 진짜 차이점은 무엇입니까?저는 현재 Base64를 사용하고 있지만 이를 위해 외부 공용 라이브러리를 포함해야 하는데 HEX와 마찬가지로 그냥 함수를 만들 수 있을 것 같습니다.

Base64에 대해서도 당신만의 방법을 쓰면 됩니다.하지만 일반적으로 외부의 잘 테스트된 라이브러리를 둘 다 사용하는 것을 추천합니다.(그것들이 부족한 것은 아닙니다.)

Base64와 hex의 차이는 실제로 바이트를 표현하는 방식입니다.헥스는 "Base16"을 말하는 또 다른 방법입니다.16진수는 각 바이트마다 2자씩 사용합니다. Base64는 3바이트마다 4자씩 사용하므로 16진수보다 효율적입니다.XML 문서를 인코딩하기 위해 UTF-8을 사용한다고 가정하면, 100K 파일은 16진수로 인코딩하는 데 200K, Base64에서 133K가 필요합니다.물론 여러분이 공간 효율성에 대해 신경 쓰지 않는 것이 당연할 수도 있습니다 - 많은 경우 그것은 중요하지 않을 것입니다.문제가 된다면 Base64가 그러한 측면에서 더 낫다는 것은 분명합니다. (더욱 효율적인 대안도 있지만 그만큼 일반적이지는 않습니다.)

EARTH base64에서 공간 증가율 33%를 위해 3개의 입력 바이트를 4개의 출력 바이트로 변환할 수 있는 방법이 궁금했습니다(hex는 공간 증가율 100%를 위해 1개의 입력 바이트를 2개의 출력 바이트로 변환함).왜 구체적으로 3개의 입력 바이트?

답은 다음과 같습니다.

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

그 마법의 "24비트" 숫자는 왜?64는 0부터 63까지 숫자를 나타냅니다.그것들은 이진법으로 어떻게 표현됩니까?000000(0)부터 111111(63)까지.

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

따라서 24비트(입력의 전체 8비트 바이트 3개) / 6비트(베이스64 알파벳) = 베이스64의 4바이트입니다.그거에요!

또는 다른 방식으로 설명하면, 모든 Base64 문자(1바이트(8비트))는 6비트의 실제 데이터를 인코딩합니다.그리고 우리가 8비트/6비트를 나누면 이 게시물의 상단에 언급된 바와 같이 33%의 성장이 어디에서 왔는지 알 수 있습니다.는 항상 Base64상터를다가도다인예는가다(egyl ).=base64 output)의도 하는 . base64의는자에자는의 ).

인코딩 시 크기가 14% 증가한 상태에서 128 베이스(입력 7비트 = 출력 8비트)를 사용하는 것이 어떨까 생각할 수도 있습니다.그에 대한 답은 128자 이하의 ASCII 문자가 모두 인쇄 가능한 것은 아니기 때문에 base64가 우리가 찾을 수 있는 최선의 방법이라는 것입니다.NULL 등 컨트롤 문자가 많습니다.

사용자 지정 인코딩 알고리즘을 만들면 원하는 작업을 무엇이든 할 수 있기 때문에 "base81" 등의 다른 시스템을 만들 수 있는 방법이 분명히 있습니다.그러나 base64의 장점은 6비트의 청크에서 데이터를 매우 깨끗하게 인코딩하는 방법과 인코딩하기 위해 "3바이트를 읽고 4바이트를 출력"하고 디코딩하기 위해 "4바이트를 읽고 3을 출력"해야 하는 방법입니다.그래서 그 인코딩 방식이 인기를 끌었습니다.

이제 이 글을 읽고 나니 더 현명해지길 바랍니다.

재미있는 업데이트:문자가 더 많은 다른 인코딩 스타일에 대해 말하자면...Asci85, 즉 Base85가 존재하며 약간 더 효율적이라는 것을 알게 되었습니다(Base64의 경우 33%가 아닌 Base85로 인코딩 시 25%의 데이터 크기 증가). https://en.wikipedia.org/wiki/Ascii85

'진짜 차이'는 단 두 가지뿐입니다.

  1. 기수.베이스64는 베이스64, 서프라이즈, 헥스는 베이스16입니다.

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

그래서 베이스64는 헥스보다 컴팩트합니다.

다른 답변들은 16루와 64루의 효율성 차이를 분명히 했습니다.

효율성보다 기본 선택이 더 많습니다.

Base64는 단순히 글자와 숫자 이상의 것을 사용합니다.구현마다 패딩을 나타내는 문장 부호와 64개 집합의 마지막 두 문자를 나타내는 문장 부호를 다르게 사용합니다.여기에는 HTTP 쿼리 문자열에서 문제가 있는 +와 =이 같은 값이 포함될 수 있습니다.

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

이것은 효율성 이상의 추가적인 관심사임에 유의하십시오.베이스는 본질적으로 더 낫거나 더 나쁜 것이 아닙니다. 단지 스케일 상에서 두 개의 다른 점들일 뿐이며, 여러분은 다른 상황에서 어느 정도 매력적인 다른 속성들을 발견할 수 있을 것입니다.

예를 들어, base32를 생각해 보겠습니다.base64보다 20% 덜 효율적이지만 HTTP 쿼리 문자열에 사용하기에 적합합니다.대부분의 비효율은 대소문자를 구분하지 않고 "0"과 "1"을 0으로 피하는 것에서 비롯됩니다. 인간에 의한 재생산의 실수입니다.

그래서 base32는 인간에게 재생산의 용이성이라는 새로운 관심사를 소개합니다.그게 고민이 되시나요?그렇지 않다면 HTTP 쿼리 문자열에서 여전히 편리하지만 대소문자를 구분하고 0과 1을 포함하는 base62와 같은 것을 선택할 수 있습니다.

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

위키피디아에는 재미있는 숫자 체계 목록이 있습니다.

사이즈가 당신에게 중요합니까?

Base64가 더 공간 효율적입니다.4자를 사용하여 3바이트를 나타내고, 16진수는 각 바이트마다 2자를 사용합니다.즉, hex는 문자열의 크기를 100%로 증가시킵니다.url 요청에 param으로 맞는 작은 문자열의 경우 추가 비용/크기는 상관없습니다.

사용 편의성이 당신에게 중요합니까?

Hex는 탈출할 필요가 없기 때문에 Base64보다 사용하기 쉽습니다(포함되어 있을 수 있음).+,=그리고./URL 요청에서 문자열을 get 매개 변수로 사용하는 경우.

광범위하게 사용하는 것이 당신에게 중요합니까?

숫자는 없지만, 몇 가지 요인에 따라 Base64가 hex보다는 일반 개발자에게 더 많이 알려질 수 있습니다.64번 베이스에 대해서는 헥스(16번 베이스)보다 훨씬 전에 알고 있었습니다.

base64는 오버헤드가 적습니다(base64는 원래 데이터의 3바이트당 4자를 생성하는 반면 hex는 원래 데이터의 바이트당 2자를 생성합니다).헥스는 더 읽기 쉽습니다. 두 문자만 보고 바로 뒤에 어떤 바이트가 있는지 알 수 있지만, 베이스64의 경우 4 문자 그룹을 해독하는 노력이 필요하므로 헥스를 사용하면 디버깅이 더 쉬워질 것입니다.

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