바이트 어레이를 JSON에 배치하거나 그 반대도 마찬가지입니다.
를 넣을 수 있습니까?byte[]
(바이트 배열) ~JSON
?
그렇다면 자바에서는 어떻게 해야 하나요?그런 다음 JSON을 읽고 해당 필드를 다시 로 변환합니다.byte[]
?
다음은 base64 인코딩 바이트 배열의 좋은 예입니다.유니코드 문자를 혼합하여 PDF 문서와 같은 것을 보내면 더 복잡해집니다.바이트 배열을 인코딩한 후 인코딩된 문자열을 JSON 속성 값으로 사용할 수 있습니다.
Apache Commons는 다음과 같은 우수한 유틸리티를 제공합니다.
byte[] bytes = getByteArr();
String base64String = Base64.encodeBase64String(bytes);
byte[] backToBytes = Base64.decodeBase64(base64String);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding
Java 서버 측 예:
public String getUnsecureContentBase64(String url)
throws ClientProtocolException, IOException {
//getUnsecureContent will generate some byte[]
byte[] result = getUnsecureContent(url);
// use apache org.apache.commons.codec.binary.Base64
// if you're sending back as a http request result you may have to
// org.apache.commons.httpclient.util.URIUtil.encodeQuery
return Base64.encodeBase64String(result);
}
JavaScript 디코드:
//decode URL encoding if encoded before returning result
var uriEncodedString = decodeURIComponent(response);
var byteArr = base64DecToArr(uriEncodedString);
//from mozilla
function b64ToUint6 (nChr) {
return nChr > 64 && nChr < 91 ?
nChr - 65
: nChr > 96 && nChr < 123 ?
nChr - 71
: nChr > 47 && nChr < 58 ?
nChr + 4
: nChr === 43 ?
62
: nChr === 47 ?
63
:
0;
}
function base64DecToArr (sBase64, nBlocksSize) {
var
sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length,
nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen);
for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
nMod4 = nInIdx & 3;
nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
if (nMod4 === 3 || nInLen - nInIdx === 1) {
for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
}
nUint24 = 0;
}
}
return taBytes;
}
json으로 바이너리를 송신하는 일반적인 방법은 base64로 인코딩하는 것입니다.
Java는 Base64 인코딩 및 디코딩을 위한 다양한 방법을 제공합니다.byte[]
이 중 하나는 입니다.
심플하게
byte[] originalBytes = new byte[] { 1, 2, 3, 4, 5};
String base64Encoded = DatatypeConverter.printBase64Binary(originalBytes);
byte[] base64Decoded = DatatypeConverter.parseBase64Binary(base64Encoded);
사용하는 json 파서/제너레이터 라이브러리에 따라 이 변환을 수행해야 합니다.
놀랍게도 org.json은 이제 바이트[] 객체를 json에 직접 넣을 수 있으며 읽을 수 있습니다.웹 소켓을 통해 결과 객체를 전송할 수도 있습니다. 그러면 다른 쪽에서 읽을 수 있습니다.그러나 결과 객체의 크기가 base64로 변환하는 경우보다 큰지 작은지 아직 확실하지 않습니다.
json 객체가 자바에서 차지하는 공간을 측정하는 것은 매우 어려울 것 같습니다.만약 당신의 json이 단순히 끈으로 구성되어 있다면 그것은 단순히 그것을 스트링하는 것만으로 쉽게 달성할 수 있지만, 나는 그 안에 byearray가 있어서 그것이 그렇게 간단하지 않을 것 같다.
json을 java로 문자열화하는 것은 ID처럼 보이는 10개의 문자열에 대한 나의 byearray를 대체한다.node.discl은 우리의 것을 대체합니다.byte[]
인용되지 않은 가치판독에 대하여<Buffered Array: f0 ff ff ...>
후자의 길이는 예상대로 300%까지 크기가 증가했음을 나타낸다.
@Qwertie의 제안에 따라, 그러나 게으른 쪽에서는 각 바이트가 ISO-8859-1 문자라고 가정할 수 있습니다.미개시자에게 ISO-8859-1은 Unicode의 첫 번째 256개의 코드 포인트와 일치하는 싱글바이트 부호화입니다.
따라서 @Ash의 답변은 문자 집합으로 실제로 교환할 수 있습니다.
byte[] args2 = getByteArry();
String byteStr = new String(args2, Charset.forName("ISO-8859-1"));
이 인코딩은 BAIS와 동일한 가독성을 가지며 BAIS 또는 base64보다 브런치가 적게 필요하기 때문에 처리속도가 빠르다는 장점이 있습니다.JSON 파서가 좀 더 많은 작업을 하고 있는 것처럼 보일 수 있지만 ASC가 아닌 경우에는 괜찮습니다.탈출 또는 UTF-8에 의한 II는 어쨌든 JSON 파서의 업무의 일부입니다.프로파일이 있는 MessagePack과 같은 일부 형식에 더 잘 매핑할 수 있습니다.
단, 공간 면에서는 JSON에 UTF-16을 사용하는 사람이 없기 때문에 일반적으로는 손실입니다.UTF-8에서는 각 비ASCII 바이트는 2바이트를 차지하지만 BAIS는 3n+r의 실행마다 (2+4n + r? (r+1):0)바이트를 사용합니다(r은 나머지입니다).
바이트 배열에 표시할 수 있는 ASCII 문자 실행이 포함되어 있는 경우 Base64 대신 BAIS(Byte Array In String) 형식을 사용할 수 있습니다. 1:들어 배열 BAIS는 ASCII가 1:1로 변환됩니다).{65,66,67}
"ABC"
또한 BAIS는 Base64보다 작은 파일사이즈를 제공하는 경우가 많습니다(이는 보증되지 않습니다).
바이트 배열을 BAIS 문자열로 변환한 후 다른 문자열과 마찬가지로 JSON에 씁니다.
바이트 배열을 문자열로 변환하고 되돌리는 Java 클래스(원래 C#에서 포트)를 다음에 나타냅니다.
import java.io.*;
import java.lang.*;
import java.util.*;
public class ByteArrayInString
{
// Encodes a byte array to a string with BAIS encoding, which
// preserves runs of ASCII characters unchanged.
//
// For simplicity, this method's base-64 encoding always encodes groups of
// three bytes if possible (as four characters). This decision may
// unfortunately cut off the beginning of some ASCII runs.
public static String convert(byte[] bytes) { return convert(bytes, true); }
public static String convert(byte[] bytes, boolean allowControlChars)
{
StringBuilder sb = new StringBuilder();
int i = 0;
int b;
while (i < bytes.length)
{
b = get(bytes,i++);
if (isAscii(b, allowControlChars))
sb.append((char)b);
else {
sb.append('\b');
// Do binary encoding in groups of 3 bytes
for (;; b = get(bytes,i++)) {
int accum = b;
if (i < bytes.length) {
b = get(bytes,i++);
accum = (accum << 8) | b;
if (i < bytes.length) {
b = get(bytes,i++);
accum = (accum << 8) | b;
sb.append(encodeBase64Digit(accum >> 18));
sb.append(encodeBase64Digit(accum >> 12));
sb.append(encodeBase64Digit(accum >> 6));
sb.append(encodeBase64Digit(accum));
if (i >= bytes.length)
break;
} else {
sb.append(encodeBase64Digit(accum >> 10));
sb.append(encodeBase64Digit(accum >> 4));
sb.append(encodeBase64Digit(accum << 2));
break;
}
} else {
sb.append(encodeBase64Digit(accum >> 2));
sb.append(encodeBase64Digit(accum << 4));
break;
}
if (isAscii(get(bytes,i), allowControlChars) &&
(i+1 >= bytes.length || isAscii(get(bytes,i), allowControlChars)) &&
(i+2 >= bytes.length || isAscii(get(bytes,i), allowControlChars))) {
sb.append('!'); // return to ASCII mode
break;
}
}
}
}
return sb.toString();
}
// Decodes a BAIS string back to a byte array.
public static byte[] convert(String s)
{
byte[] b;
try {
b = s.getBytes("UTF8");
} catch(UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage());
}
for (int i = 0; i < b.length - 1; ++i) {
if (b[i] == '\b') {
int iOut = i++;
for (;;) {
int cur;
if (i >= b.length || ((cur = get(b, i)) < 63 || cur > 126))
throw new RuntimeException("String cannot be interpreted as a BAIS array");
int digit = (cur - 64) & 63;
int zeros = 16 - 6; // number of 0 bits on right side of accum
int accum = digit << zeros;
while (++i < b.length)
{
if ((cur = get(b, i)) < 63 || cur > 126)
break;
digit = (cur - 64) & 63;
zeros -= 6;
accum |= digit << zeros;
if (zeros <= 8)
{
b[iOut++] = (byte)(accum >> 8);
accum <<= 8;
zeros += 8;
}
}
if ((accum & 0xFF00) != 0 || (i < b.length && b[i] != '!'))
throw new RuntimeException("String cannot be interpreted as BAIS array");
i++;
// Start taking bytes verbatim
while (i < b.length && b[i] != '\b')
b[iOut++] = b[i++];
if (i >= b.length)
return Arrays.copyOfRange(b, 0, iOut);
i++;
}
}
}
return b;
}
static int get(byte[] bytes, int i) { return ((int)bytes[i]) & 0xFF; }
public static int decodeBase64Digit(char digit)
{ return digit >= 63 && digit <= 126 ? (digit - 64) & 63 : -1; }
public static char encodeBase64Digit(int digit)
{ return (char)((digit + 1 & 63) + 63); }
static boolean isAscii(int b, boolean allowControlChars)
{ return b < 127 && (b >= 32 || (allowControlChars && b != '\b')); }
}
다음 항목도 참조하십시오.C# 유닛 테스트
간단하게 말하면 다음과 같습니다.
byte[] args2 = getByteArry();
String byteStr = new String(args2);
언급URL : https://stackoverflow.com/questions/20706783/put-byte-array-to-json-and-vice-versa
'programing' 카테고리의 다른 글
스프링 부츠 스타터 항아리가 뭐죠? (0) | 2023.03.06 |
---|---|
Angularjs 지시어:격리된 범위 및 특성 (0) | 2023.03.06 |
Typscript async/ait가 Angular를 업데이트하지 않음JS 뷰 (0) | 2023.03.01 |
WooCommerce - URL에서 제품 및 제품 카테고리를 삭제하는 방법 (0) | 2023.03.01 |
React를 통한 빅리스트 퍼포먼스 (0) | 2023.03.01 |