【问题标题】:java integer to byte, and byte to integerjava整数到字节,字节到整数
【发布时间】:2012-07-10 10:28:43
【问题描述】:

我知道 - 在 Java 中 - int 是 4 个字节。但我希望将一个 int 转换为 n 字节数组,其中 n 可以是 1、2、3 或 4 个字节。我想将它作为带符号的字节/字节,这样如果我需要将它们转换回 int(如果它是 1 个字节,则事件),我会得到相同的带符号的 int。我完全意识到从 int 转换为 3 或更低字节时精度损失的可能性。

我设法从 int 转换为 n-byte,但将其转换回负数会产生无符号结果。

编辑:

int 到字节(参数 n 指定所需的字节数为 1、2、3 或 4,而不管可能的进动损失)

public static byte[] intToBytes(int x, int n) {
    byte[] bytes = new byte[n];
    for (int i = 0; i < n; i++, x >>>= 8)
        bytes[i] = (byte) (x & 0xFF);
    return bytes;
}

字节转 int(不管 1、2、3 或 4 有多少字节)

public static int bytesToInt(byte[] x) {
    int value = 0;
    for(int i = 0; i < x.length; i++)
        value += ((long) x[i] & 0xffL) << (8 * i);
    return value;
}

bytes to int 转换器可能有问题。

【问题讨论】:

    标签: java int byte


    【解决方案1】:

    BigInteger.toByteArray() 会为你做这件事...

    返回一个字节数组,其中包含此BigInteger 的二进制补码表示。字节数组将采用大端字节序:最高有效字节位于第零个元素中。 该数组将包含表示此BigInteger, 所需的最少字节数,其中至少包括一个符号位,即(ceil((this.bitLength() + 1)/8))。 (此表示与(byte[]) 构造函数兼容。)

    示例代码:

    final BigInteger bi = BigInteger.valueOf(256);
    final byte[] bytes = bi.toByteArray();
    
    System.out.println(Arrays.toString(bytes));
    

    打印:

    [1, 0]
    

    要从字节数组返回 int,请使用 BigInteger(byte[]) 构造函数:

    final int i = new BigInteger(bytes).intValue();
    System.out.println(i);
    

    打印预期的:

    256
    

    【讨论】:

    • 我知道 BigInteger。但是 BigInteger 按照指示返回确切的字节,而不是 1、2、3 或 4。例如 5 将始终为 1 个字节,但我希望将其设置为 2/3/4 字节。
    • 我最终将new BigInteger(bytes).intValue() 用于我的bytesToInt
    【解决方案2】:

    不管怎样,这是我拼凑的代码:

    public static void main(String[] args) throws Exception {
      final byte[] bi = encode(-1);
      System.out.println(Arrays.toString(bi));
      System.out.println(decode(bi));
    }
    private static int decode(byte[] bi) {
      return bi[3] & 0xFF | (bi[2] & 0xFF) << 8 |
             (bi[1] & 0xFF) << 16 | (bi[0] & 0xFF) << 24;
    }
    private static byte[] encode(int i) {
      return new byte[] { (byte) (i >>> 24), (byte) ((i << 8) >>> 24),
                          (byte) ((i << 16) >>> 24), (byte) ((i << 24) >>> 24)
      };
    }
    

    【讨论】:

    • 这仅适用于 4 个字节,而不适用于 1、2、3 或 4 个字节,如我在问题中所述,返回 int。另外,看看你要求什么。谢谢
    • 那么是什么阻止您从我的代码中汲取灵感,因为它正在工作?您需要将您的+ 替换为|。顺便说一句,您不需要使用long
    • 我正在使用 4 个字节,顺便说一句。经过反复试验,long 的使用仍然存在,我应该在发布之前将其删除。用| 替换+ 并没有改变。问题在于小于 4 的字节具有负整数。
    • 如果 int 小于 4 字节,您需要 sign-extend。或者只使用BigInteger 进行解码。
    【解决方案3】:

    类似:

    int unsignedByte = ((int)bytes[i]) & 0xFF;
    
    int n = 0;
    n |= unsignedByte << 24;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-08
      • 2011-05-29
      • 2019-02-12
      • 2015-03-21
      • 2015-10-18
      • 1970-01-01
      • 2011-06-27
      相关资源
      最近更新 更多