繁体   English   中英

Java-byte []到int的转换,反之亦然

[英]Java - byte[] to int conversion and vice versa

我正在移植一些php代码以及python代码,这是两个功能。 它们的目的是将整数解析为字节数组,反之亦然。 但是它工作了一段时间,但是现在我得到了无效的整数错误。

我得到了以下Python代码段,这些代码段已转换为Java:

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"

这是否意味着整数值太大,或者是什么问题?

valEnc.getBytes()将使用主机平台的默认编码将String转换为字节,该编码将为UTF-16LE(在Windows中)或UTF-8(所有其他平台,包括您的平台)。

您的字符串包含ISO 8859-1字符,但是valEnc.getBytes()那些值大于127的字符解码为多个字节。 要解决此问题,请使用valEnc.getBytes(StandardCharsets.ISO_8859_1) 这样就可以保证每个字符获得一个字节。

但是,这提出了一个问题,为什么您首先要打扰使用String。 您已经有一个字节数组,其每个字节代表一个ISO 8859-1字符。 您应该从方法中完全删除valEnc

实际上,没有理由将字节转换为十六进制然后进行解析。 您可以使用以下命令将四个字节转换为一个int:

return ByteBuffer.wrap(val).getInt();

有关更多信息,请参见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();

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM