Java charAt问题

向日一说
  • 252

调试的时候发现为什么不一致?

测试代码:

import org.junit.Test;

import static org.junit.Assert.*;

public class Test {

    @Test
    public void main() {
        new String(fromHexString("3900c29368")).charAt(2);
    }

    public static byte[] fromHexString(String hexString) {
        if (null == hexString || "".equals(hexString.trim())) {
            return new byte[0];
        }
        byte[] bytes = new byte[hexString.length() / 2];
        String hex;
        for (int i = 0; i < hexString.length() / 2; i++) {
            hex = hexString.substring(i * 2, i * 2 + 2);
            bytes[i] = (byte) Integer.parseInt(hex, 16);
        }
        return bytes;
    }
}
回复
阅读 347
1 个回答
✓ 已被采纳

[57, 0, -109, 104] 你字符串结果是这个. charAt(2)是-109 , -109&0xFF = 147.

fromHexString("3900c29368")返回的是[57, 0, -62, -109, 104]。你用new String(byte[]) 最后应该走的java.lang.StringCoding#decodeUTF8_0方法,这个会遍历你传过来的字节数组,其中在遇到0xc2(注意-62就是0xc2)时,会和后一个字节一起处理,所有最后的字符串里只有四个字节了。

image.png

我也不清楚为啥要对0xc2,0xc3这样处理。

你知道吗?

宣传栏