0

文字列から整数値が与えられた場合、それを2バイトの符号付き整数に変換したいと思います。

BigInteger仕事はしますが、2バイトを付与する方法がわかりません...

public void handleThisStringValue(String x, String y){
  BigInteger bi_x = new BigInteger(x, 10);          
  BigInteger bi_y = new BigInteger(y, 10);
  byte[] byteX = bi_x.toByteArray();
  byte[] byteY = bi_y.toByteArray();
}

BigInteger.toByteArray()私に適した負の値を処理することに気づきました。

次に、それらの値(負の値と正の値)を読み取るか、に変換すると言う必要がありbyte[2]ますsigned int。なにか提案を?

4

4 に答える 4

2

さて、あなたの質問はまだ特定の情報を欠いています。

まず、Java整数は32ビット長であるため、2バイト配列に収まりません。4バイト配列が必要です。そうでない場合、実際には16ビット長の短いデータ型を処理します。

また、任意の種類のバイト順序(リトルエンディアン、ビッグエンディアン)を処理する必要があるかどうかもわかりません。

いずれにせよ、16ビットとビッグエンディアンのバイト順序にのみ適合する整数を使用していると仮定すると、次のようにしてバイト配列を作成できます。

public static byte[] toByteArray(String number){
    ByteBuffer buffer = ByteBuffer.allocate(4);
    buffer.putInt(Integer.parseInt(number));
    return Arrays.copyOfRange(buffer.array(), 2, 4); //asumming big endian
}

そして、それを元に戻すには、次のようにします。

public static int toInteger(byte[] payload){
    byte[] data = new byte[4];
    System.arraycopy(payload, 0, data, 2, 2);
    return ByteBuffer.wrap(data).getInt(); 
}

メソッドを使用して、ByteBufferのバイト順序を変更することもできますByteBuffer.order

私はそれを次のように使用しました:

byte[] payload = toByteArray("255");
int number = toInteger(payload);
System.out.println(number);

出力は255

于 2012-04-27T14:52:42.860 に答える
1
int x = bs[0] | ((int)bs[1] << 8);
if (x >= 0x8000) x -= 0x10000;
// Reverse
bs[0] = (byte)(x & 0xFF);
bs[1] = (byte)((x >> 8) & 0xFF);
于 2012-04-27T14:27:25.873 に答える
0

あなたは逆を作ることができます:

new BigInteger(byteX);
new BigInteger(byteY);

それはまさにあなたが望むものであり、それからあなたはそれをと.intvalue()して得るために使うことができますint

于 2012-04-27T14:39:41.297 に答える
0

解決策は簡単で、ここで見つけた投稿に基づいています(すべてに感謝します):

2バイトの整数が欲しかったことを思い出してください...だからそれは短いです!

String val= "-32";
short x = Short.parseShort(val);
byte[] byteX = ByteBuffer.allocate(2).putShort(x).array();

...そしてそれは機能します!

次に、BigIntegerを使用して読み返します。

int x1 = new BigInteger(byteX).intValue();

また

short x2 = new BigInteger(x).shortValue();
于 2012-04-28T10:21:37.663 に答える