簡體   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