3

ショートを2バイトに変換しようとしています...そしてそれらの2バイトから同じショート値を取得しようとしています。そのために、私はこのコードを書きました:


        short oldshort = 700;

        byte 333= (byte) (oldshort);
        byte byte2= (byte) ((oldshort >> 8) & 0xff);

        short newshort = (short) ((byte2 << 8) + byte1);

            System.out.println(oldshort);
        System.out.println(newshort);

700(oldshort)の値の場合、newhosrtは444です。いくつかのテストの後、このコードは一部の値に対してのみ機能します。たとえば、oldshort = 50の場合は正常に機能しますが、-200、または127より大きい値(私は思う)の場合は機能しません。符号付きバイトや2の補数などに問題があると思いますが、解決方法がわかりません。

何か案が??これをJavaで行うネイティブな方法はありますか?前もって感謝します!

4

2 に答える 2

5

再結合するときは、byte1をマスクして、符号拡張されないようにする必要があります。

例えば

    short oldshort = 700;

    byte byte1= (byte) (oldshort);
    byte byte2= (byte) ((oldshort >> 8) & 0xff);

    short newshort = (short) ((byte2 << 8) + (byte1&0xFF);

        System.out.println(oldshort);
    System.out.println(newshort);

編集:Javaのバイトとショートに対するすべての操作は、実際には整数として実行されます。したがって、を書くとき +byte1、実際に起こっていることは、バイトが最初に整数にキャストされることです(符号拡張)。それでも同じ値になりますが、ビット数が増えます。次に、下位8ビットをマスクして、符号なしでショートから元の8ビットを取得できます。

E.g. short =511 = 0x01FE
     // lots of 0x000's because the operations are done on 32-bit int's
     byte1 = (0x000001FE & 0x000000FF) = (0x01FE & 0xFF) = 0xFE = (byte)-2
     byte2 = 0x1

     newShort = (byte2 << 8) + (byte1 & 0xFF)
              = (0x1 << 8) + (0xFE & 0xFF)
            // since the ops are performed as int's
              = (0x00000001 << 8) + (0xFFFFFFFE & 0x000000FF)
            // 0xFFFFFFFE = -2 
              = (0x00000100) + (0x000000FE)
              = 0x000001FE
              = 511
于 2010-06-25T01:20:43.953 に答える
1

com.google.common.primitives.Shorts次のメソッドを持つを使用することもできます。

  • public static byte[] toByteArray(short value)
  • public static short fromByteArray(byte[] bytes)
于 2017-11-20T20:33:14.757 に答える