将int转换为byte []

时间:2014-07-14 16:45:33

标签: java android bluetooth

我正在从Android的屏幕上读取一个值并尝试将其转换为字节[]以通过蓝牙发送它,但每次从屏幕获取128时,它会将其转换为字节中的-128 [ ]而且我在另一边没有得到任何东西。问题是什么。为什么它给出负数?...

这是转换代码:

ByteBuffer.allocate(4).putInt(yourInt).array();

编辑:另一方面,我必须将byte []转换为String。

另一个问题..如果我降低allocate()中的数字,我得到一个BufferOverflowException,即使我在数组中只使用了1个位置。为什么呢?

编辑2:我正在使用8位数字(0-255)

3 个答案:

答案 0 :(得分:1)

public static void main(String[] args) {
    byte[] num = BigInteger.valueOf(-2147483648).toByteArray();
        System.out.println(new BigInteger(num).intValue());
    }

如果你只想传输一个字节,值为0-255,那么

public static void main(String[] args) {
    for(int i=0; i<=255; i++){
        byte a = (byte) i;
        byte[] num = new byte [] {(byte) a};
        System.out.println(num[0] + " : " + i + " : " + ((256+num[0]) % 256));
    }
}

第二个代码将字节变量转换为相等的整数输出。

答案 1 :(得分:0)

代码执行此操作的原因是因为您的整数(128)看起来像 1000000二进制文件,带有一堆前导零。由于所有Java原语都是有符号的,因此前导位为0,这就好了。但是,当您转换为字节时,前导位将被解释为符号位,因此最后byte被解释为负数。

documentation也非常清楚putInt()将整数的所有4个字节写入缓冲区,而不是仅仅“使用”的字节。

答案 2 :(得分:0)

您在ByteBuffer中看到了正确的值。缓冲区的最后一个字节的字节值为0x80,如果你签名,则在哑终端显示时,扩展为较长的int值,显示为-128。

BYTE VALUES
1000 0000 

这个高位通常指定有符号字节/ short / int系统中的负数。

如果你通过前面的1位将这个有符号的字节转换为像int这样的更大的类型,你会看到:

1111 1111 1111 1111 1111 1111 1000 0000 

其中-128表示为signed int。