我正在移植一些PHP代码以及python代码,这是两个函数。它们的目的是将整数解析为字节数组,反之亦然。然而它工作了一段时间,但现在我得到无效的整数错误。
我得到了以下我转换为Java的python片段:
def _deAdjustId(val):
if sys.version_info >= (3,0):
valEnc = val.encode('latin-1') if type(val) is str else val
else:
valEnc = val
return int(binascii.hexlify(valEnc), 16)
我的Java代码:
private static int deAdjustId(byte[] val) {
String valEnc;
try {
valEnc = new String(val, "iso-8859-1");
} catch (UnsupportedEncodingException e) {
valEnc = new String(val);
}
return Integer.parseInt(BinAscii.hexlify(valEnc.getBytes()), 16);
}
此处给出的错误如下:
caught exception: Invalid int: "325FC398C3AB"
这是否意味着整数值太大,或者问题是什么?
答案 0 :(得分:1)
valEnc.getBytes()
将使用主机平台的默认编码将字符串转换为字节,该编码将是UTF-16LE(在Windows中)或UTF-8(所有其他平台,包括您的平台)。
您的字符串包含ISO 8859-1字符,但任何值大于127的字符都被valEnc.getBytes()
解码为多个字节。要解决此问题,请使用valEnc.getBytes(StandardCharsets.ISO_8859_1)
。然后你将保证每个字符有一个字节。
然而,这引发了一个问题,为什么你会首先使用String。您已经有一个字节数组,其每个字节代表一个ISO 8859-1字符。您应该完全从方法中删除valEnc
。
实际上,没有理由将字节转换为十六进制,然后解析它们。您只需将四个字节转换为int:
return ByteBuffer.wrap(val).getInt();
有关详细信息,请参阅documentation for ByteBuffer,尤其是getInt方法。
更新:似乎val
无法保证其尺寸,因此您需要考虑到这一点:
if (val == null) {
return 0;
}
if (val.length >= 4) {
return ByteBuffer.wrap(val).getInt();
}
ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.position(4 - val.length);
buffer.put(val);
buffer.rewind();
return buffer.getInt();
答案 1 :(得分:0)
Python int
与Java中的BigInteger
类似:
private static BigInteger deAdjustId(byte[] val) {
String valEnc;
try {
valEnc = new String(val, "iso-8859-1");
} catch (UnsupportedEncodingException e) {
valEnc = new String(val);
}
return new BigInteger(BinAscii.hexlify(valEnc.getBytes()), 16);
}
甚至:
private static BigInteger deAdjustId(byte[] val) {
return new BigInteger(val);
}