字节数组,长度与数字可变

时间:2016-12-26 11:33:08

标签: java arrays byte data-conversion

我需要将数字转换为字节数组,然后再转换为数字。 问题是字节数​​组的大小是可变的,所以我需要转换给定字节长度的数字,我想出的方法是:(Java)

private static byte[] toArray(long value, int bytes) {
    byte[] res = new byte[bytes];

    final int max = bytes*8;
    for(int i = 1; i <= bytes; i++)
        res[i - 1] = (byte) (value >> (max - 8 * i));

    return res;
}

private static long toLong(byte[] value) {
    long res = 0;

    for (byte b : value)
        res = (res << 8) | (b & 0xff);

    return res;
}

这里我使用long,因为8是我们可以使用的最大字节数。 这种方法与正数完美匹配,但我似乎无法使解码与负数一起使用。

编辑:为了测试这个,我尝试过处理值Integer.MIN_VALUE + 1(-2147483647)和4个字节

2 个答案:

答案 0 :(得分:1)

看一下Apache Common Conversion.intToByteArray util方法。

的JavaDoc:

  

使用默认(little endian,Lsb0)字节和位排序将int转换为byte数组

答案 1 :(得分:1)

  

在接受此作为工作解决方案之后,Asker又做了一些   优化。
我已经在下面添加了自己的
linked code   参考:

private static long toLong(byte[] value) {
    ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
    final byte val = (byte) (value[0] < 0 ? 0xFF : 0);

    for(int i = value.length; i < Long.BYTES; i++)
        buffer.put(val);

    buffer.put(value);
    return buffer.getLong(0);
}

老人的答案

修改:根据评论(更好地理解问题)

要使toLong功能同时处理否定&amp; 正面数字试试这个:

private static long toLong(byte[] value) 
{
    long res = 0;
    int tempInt = 0;
    String tempStr = ""; //holds temp string Hex values

    tempStr = bytesToHex(value);

    if (value[0] < 0 ) 
    { 
        tempInt = value.length;
        for (int i=tempInt; i<8; i++) { tempStr = ("FF" + tempStr); }

        res = Long.parseUnsignedLong(tempStr, 16); 
    }
    else { res = Long.parseLong(tempStr, 16); }

    return res;

}

以下是相关的bytesToHex函数(重新计算为与任何byte[]输入一起开箱即用...)

public static String bytesToHex(byte[] bytes)
{ String tempStr = ""; tempStr = DatatypeConverter.printHexBinary(bytes); return tempStr; }