2010-06-25 41 views
3

我试图将一个短转换为2个字节...然后从这两个字节尝试获得相同的短值。对于这一点,我已经写了这个代码:从短转换为字节和viceversa在Java


     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经过一番测试,它looksl IKE \ t这代码只对某些值。就像...如果oldshort = 50,那么它会正常工作..但如果它是-200,或者比127更大的值(我认为)它不起作用。我猜想有符号字节,二进制补码值等有问题......但我无法弄清楚如何解决它。

任何想法??任何本地的方式来做到这一点在Java?提前致谢!

+1

不要使用加(+)重组时,你想按位OR( |)。 – 2010-06-25 01:43:02

+0

@Ben - 他们在这种情况下有什么不同? – mdma 2010-06-25 02:48:17

+0

区别在于ADD在进行时饱和。更重要的是,当您尝试按位操作时,请使用按位运算符。如果你想要'x'的按位补码,你不会写' - 1 - x',你会吗? – 2010-06-25 03:37:53

回答

5

重新组合时,您需要屏蔽字节1以阻止它被符号扩展。

E.g.

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 
+0

呵呵,我不知道make(byte1&0xFF)可以让Java把它当作unsigned。你能详细解释一下吗? – 2010-06-25 01:30:53

+0

是(byte1&0xFF)使它成为int吗? – 2010-06-25 01:34:04

+1

小于int的整数类型的操作首先隐式转换为int。所以,在0xFF与值之前,值首先被扩展为一个int,然后掩码丢弃所有的高位。我的编辑更详细地显示了这一点。 – mdma 2010-06-25 01:43:22

0

您也可以使用com.google.common.primitives.Shorts,它拥有一些方法:

  • public static byte[] toByteArray(short value)
  • public static short fromByteArray(byte[] bytes)