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 现在是 0bytes[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的, 这样你就可以知道输出的字符串是怎样的。