【问题标题】:Byte Array to *Signed* Int字节数组到 *Signed* Int
【发布时间】:2012-08-12 11:53:54
【问题描述】:

我正在尝试将-101 转换为字节数组,然后将字节数组转换回-101。我下面的方法适用于正值,但不适用于负值。你能建议我做错了什么吗? byteArrayToInt 方法返回 65435,而不是 -101。谢谢!

/**
 * Converts a <code>byte</code> array to a 32-bit <code>int</code>.
 * 
 * @param array The <code>byte</code> array to convert.
 * @return The 32-bit <code>int</code> value.
 */
public static int byteArrayToInt(byte[] array) {
  ValidationUtils.checkNull(array);
  int value = 0;

  for (int i = 0; i < array.length; i++) {
    int shift = (array.length - 1 - i) * 8;
    value = value | (array[i] & 0xFF) << shift;
  }

  return value;
}

/**
 * Converts a 32-bit <code>int</code> to a <code>byte</code> array.
 * 
 * @param value The 32-bit <code>int</code> to convert.
 * @return The <code>byte</code> array.
 */
public static byte[] intToByteArray(int value, int size) {
  byte[] bytes = new byte[size];
  for (int index = 0; index < bytes.length; index++) {
    bytes[index] = (byte) (value >>> (8 * (size - index - 1)));
  }
  return bytes;
}

/**
 * Tests the utility methods in this class.
 * 
 * @param args None.
 */
public static void main(String... args) {
  System.out.println(byteArrayToInt(intToByteArray(32, 2)) == 32); // true
  System.out.println(byteArrayToInt(intToByteArray(64, 4)) == 64); // true
  System.out.println(byteArrayToInt(intToByteArray(-101, 2)) == -101); // false
  System.out.println(byteArrayToInt(intToByteArray(-101, 4)) == -101); // true
}

【问题讨论】:

    标签: java bytearray signed


    【解决方案1】:

    您需要签署分机号码。如果您还没有,您应该阅读two's complement 符号二进制数的表示。

    数字 -101 作为 32 位整数是十六进制的 0xFFFFFF9B。您将其转换为 2 个字节的字节数组。剩下的只是0xFF9B。现在,当您将其转换回时,您将其转换为 32 位整数,结果是 0x0000FF9B,或十进制的 65435

    您应该检查字节数组中的最高位并基于此进行符号扩展。一种简单的方法是,如果设置了最高位,则从 value=-1 开始,如果没有设置,则默认为 value=0

    编辑:检查最高位的一种简单方法是检查高位字节是否为负。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多