Java:如何将字节数组转换为 JSON 字符串(即将转换为 JSON 对象)?
Java: How does converting a byte array to JSON String (which is to be converted into a JSON object) work?
我看到了一个 android 教程,看到了以下我不太明白的方法:
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
这个方法的主要目的是将websocket接收到的byte数组转换为json字符串,即将转换为json对象,像这样:
@Override
public void onMessage(byte[] data) {
Log.d(TAG, String.format("Got binary message! %s",
bytesToHex(data)));
// Message will be in JSON format
parseMessage(bytesToHex(data));
}
....
private void parseMessage(final String msg) {
try {
JSONObject jObj = new JSONObject(msg);
...
bytesToHex 方法如何工作?我只知道它循环遍历字节数组,然后执行一个 AND 操作,使字节保持原样(我看不出它的意义)。在那条线之后,我迷路了。 >>> 是做什么的?
例如,j
现在是 0
,bytes[j]
现在是 1110 1111
。
int v = bytes[j] & 0xFF;
等价于int v = bytes[j];
,我想,因为一个字节在Java和0xFF
中是8个位(1111 1111)和1110 1111 & 1111 1111 等于 1110 1111.
现在 v 是 1110 1111
.
hexChars[j * 2] = hexArray[v >>> 4];
将v(1110
)的高4位映射为char,保存到hexChars[0]
,因为>>>
是"move bits to right and fill with zeros",所以 1110 1111 >>> 4 等于 0000 1110.
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
将v(1111
)的低4位映射为char,保存到hexChars[1]
,因为1110 1111 & 0000 1111(0x0F)等于0000 1111。
关于为什么这样的字符串可以被解析为JSON,我想你必须阅读一些关于数组hexArray
的东西才能找出从0000到1111的整数是如何映射到char的, 这样你就可以知道输出的字符串是怎样的。
我看到了一个 android 教程,看到了以下我不太明白的方法:
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
这个方法的主要目的是将websocket接收到的byte数组转换为json字符串,即将转换为json对象,像这样:
@Override
public void onMessage(byte[] data) {
Log.d(TAG, String.format("Got binary message! %s",
bytesToHex(data)));
// Message will be in JSON format
parseMessage(bytesToHex(data));
}
....
private void parseMessage(final String msg) {
try {
JSONObject jObj = new JSONObject(msg);
...
bytesToHex 方法如何工作?我只知道它循环遍历字节数组,然后执行一个 AND 操作,使字节保持原样(我看不出它的意义)。在那条线之后,我迷路了。 >>> 是做什么的?
例如,j
现在是 0
,bytes[j]
现在是 1110 1111
。
int v = bytes[j] & 0xFF;
等价于int v = bytes[j];
,我想,因为一个字节在Java和0xFF
中是8个位(1111 1111)和1110 1111 & 1111 1111 等于 1110 1111.
现在 v 是 1110 1111
.
hexChars[j * 2] = hexArray[v >>> 4];
将v(1110
)的高4位映射为char,保存到hexChars[0]
,因为>>>
是"move bits to right and fill with zeros",所以 1110 1111 >>> 4 等于 0000 1110.
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
将v(1111
)的低4位映射为char,保存到hexChars[1]
,因为1110 1111 & 0000 1111(0x0F)等于0000 1111。
关于为什么这样的字符串可以被解析为JSON,我想你必须阅读一些关于数组hexArray
的东西才能找出从0000到1111的整数是如何映射到char的, 这样你就可以知道输出的字符串是怎样的。