개발관련/other

JSON 문자열의 이진 데이터. Base64보다 나은 것

Rateye 2021. 9. 10. 10:09
728x90
반응형
질문 : JSON 문자열의 이진 데이터. Base64보다 나은 것

JSON 형식은 기본적으로 바이너리 데이터를 지원하지 않습니다. 이진 데이터는 JSON에서 문자열 요소 (즉, 백 슬래시 이스케이프를 사용하여 큰 따옴표로 묶인 0 개 이상의 유니 코드 문자)에 배치 될 수 있도록 이스케이프되어야합니다.

이진 데이터를 이스케이프하는 확실한 방법은 Base64를 사용하는 것입니다. 그러나 Base64는 처리 오버 헤드가 높습니다. 또한 3 바이트를 4 자로 확장하여 데이터 크기를 약 33 % 증가시킵니다.

이에 대한 한 가지 사용 사례는 CDMI 클라우드 스토리지 API 사양 의 v0.8 초안입니다. JSON을 사용하여 REST-Webservice를 통해 데이터 개체를 생성합니다.

PUT /MyContainer/BinaryObject HTTP/1.1
Host: cloud.example.com
Accept: application/vnd.org.snia.cdmi.dataobject+json
Content-Type: application/vnd.org.snia.cdmi.dataobject+json
X-CDMI-Specification-Version: 1.0
{
    "mimetype" : "application/octet-stream",
    "metadata" : [ ],
    "value" :   "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz
    IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg
    dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu
    dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo
    ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=",
}

바이너리 데이터를 JSON 문자열로 인코딩하는 더 좋은 방법과 표준 방법이 있습니까?

답변

JSON 사양에 따라 1 바이트로 표현할 수있는 94 개의 유니 코드 문자가 있습니다 (JSON이 UTF-8로 전송되는 경우). 이를 염두에두고 공간적으로 할 수있는 최선의 방법은 4 바이트를 5 문자로 나타내는 base85입니다. 그러나 이것은 base64에 비해 7 % 향상에 불과하고 계산 비용이 더 많이 들고 구현이 base64보다 덜 일반적이므로 아마도이기는 것이 아닙니다.

또한 모든 입력 바이트를 U + 0000-U + 00FF의 해당 문자에 매핑 한 다음 해당 문자를 전달하기 위해 JSON 표준에 필요한 최소 인코딩을 수행 할 수도 있습니다. 여기서의 장점은 필요한 디코딩이 내장 함수를 넘어서 nil이지만 공간 효율성이 나쁘다는 것입니다. (모든 입력 바이트가 동일한 경우) 105 % 확장, base85의 경우 25 % 또는 base64의 경우 33 %입니다.

최종 평결 : base64는 일반적이고 쉬우 며 교체를 보증 할만큼 나쁘지 않다는 점에서 승리합니다.

참조 : Base91Base122

출처 : https://stackoverflow.com/questions/1443158/binary-data-in-json-string-something-better-than-base64

 

728x90
반응형