将十六进制转换为INT 32和STRING Little Endian



第一个问题:

十六进制:F1620000

在将十六进制转换为INT 32后,我预计会有253229,但我得到了-2453235712。我试过这些方法:

Integer.parseUnsignedInt(value, 16));
(int)Long.parseLong(value, 16));
new BigInteger(value, 16).intValue());

如何获得正确的值?

第二个问题:

十六进制:9785908D9B9885828020912E208D2E

将十六进制转换为字符串后,我可以得到以下值:

u0097u0085u0090u008du009bu0098u0085u0082u0080 u0091. u008d.

如何在json中正确显示此值?(使用JSONObject(。

StringBuilder result = new StringBuilder();
for (int i = 0; i < value.length(); i += 2) {
String str = value.substring(i, i + 2);
result.append((char)Integer.parseInt(str, 16));
}

所有尝试都足以解析无符号解释中的十六进制字符串,但没有考虑到"little-endian"表示。您必须手动反转字节码:

String value = "F1620000";
int i = Integer.reverseBytes(Integer.parseUnsignedInt(value, 16));
System.out.println(i);
25329

对于第二个任务,缺少的信息是如何解释字节以获得字符内容。经过一点搜索,代码页866似乎是最合理的编码:

String value = "9785908D9B9885828020912E208D2E";
byte[] bytes = new BigInteger(value, 16).toByteArray();
String result = new String(bytes, bytes[0]==0? 1: 0, value.length()/2, "CP866");
ЧЕРНЫШЕВА С. Н.

最新更新