我看到了一个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上接收到的字节数组转换为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中,一个字节占用8个比特,而0xFF
是8个设置比特(11111111)和11101111&11111111等于11101111。
现在v是1110 1111
。
hexChars[j * 2] = hexArray[v >>> 4];
将v(1110
)的高4位映射到char,并将其保存到hexChars[0]
,因为>>>
是"向右移动位并填充零",所以1110 1111>>4等于0000 1110。
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
将v(1111
)的低4位映射到char,并将其保存到hexChars[1]
,因为11101111&0000 1111(0x0F)等于0000 1111。
关于为什么这样的字符串可以被解析为JSON,我想你必须阅读一些关于数组hexArray
的内容,以了解从0000到1111的整数是如何映射到char的,这样你就可以知道输出字符串是什么样子的。