질문 : 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는 일반적이고 쉬우 며 교체를 보증 할만큼 나쁘지 않다는 점에서 승리합니다.
출처 : https://stackoverflow.com/questions/1443158/binary-data-in-json-string-something-better-than-base64
'개발관련 > other' 카테고리의 다른 글
Xcode 10 오류 : Multiple commands produce (0) | 2021.09.10 |
---|---|
개행 문자 \ r \ n, \ r 및 \ n의 차이점 (0) | 2021.09.10 |
Express에서 전체 URL을 얻는 방법 (0) | 2021.09.09 |
JSON는 객체에서 배열 마지막 항목에 후행 쉼표를 허락하는가? (0) | 2021.09.09 |
Mac에서 Android Studio를 완전히 제거하는 방법 (0) | 2021.09.08 |