1

-101バイト配列に変換してから、バイト配列を に戻そうとしてい-101ます。以下の私の方法は、正の値では機能しますが、負の値では機能しません。私が間違っていることを提案できますか?の代わりに-101byteArrayToIntメソッドは を返します65435。ありがとう!

/**
 * 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
}
4

1 に答える 1

3

番号を符号拡張する必要があります。まだ読んでいない場合は、符号付き 2 進数の 2 の補数表現を読んでください。

-10132 ビット整数としての数値は0xFFFFFF9B16 進数です。これを 2 バイトのバイト配列に変換します。残りは0xFF9B. これを元に戻すと、32 ビット整数に変換され、結果は0x0000FF9B、または6543510 進数になります。

バイト配列の最上位ビットを確認し、それに基づいて符号を拡張する必要があります。これを行う簡単な方法は value=-1、最上位ビットが設定されている場合から開始し、設定されvalue=0ていない場合はデフォルトにすることです。

編集:最上位ビットを確認する簡単な方法は、上位バイトが負かどうかを確認することです。

于 2012-08-16T06:57:40.967 に答える