gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:39:59 27 4
gpt4 key购买 nike

我正在移植一些 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() 将使用主机平台的默认编码将字符串转换为字节,该编码将是 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();

关于Java - byte[] 到 int 的转换,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479082/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com