6

我有二进制字符串String A = "1000000110101110"。我想将此字符串转换为长度为 2 的字节数组java

我已获得链接的帮助

我试图通过各种方式将其转换为字节

  1. 我首先将该字符串转换为十进制,然后应用代码存储到字节数组中

    int aInt = Integer.parseInt(A, 2);
            byte[] xByte = new byte[2];
        xByte[0] = (byte) ((aInt >> 8) & 0XFF);
        xByte[1] = (byte) (aInt & 0XFF);
        System.arraycopy(xByte, 0, record, 0,
                xByte.length);
    

但是存储到字节数组中的值是负数

xByte[0] :-127
xByte[1] :-82

哪些是错误的值。

2.我也试过使用

byte[] xByte = ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putInt(aInt).array();

但是它会在上面的行中抛出异常,例如

  java.nio.Buffer.nextPutIndex(Buffer.java:519)     at
  java.nio.HeapByteBuffer.putInt(HeapByteBuffer.java:366)   at
  org.com.app.convert.generateTemplate(convert.java:266)

我现在应该怎么做才能将二进制字符串转换为 2 个字节的字节数组?是否有任何内置函数java来获取字节数组

4

4 回答 4

2

试试这个

String s = "1000000110101110";
int i = Integer.parseInt(s, 2);
byte[] a = {(byte) ( i >> 8), (byte) i};
System.out.println(Arrays.toString(a));
System.out.print(Integer.toBinaryString(0xFF & a[0]) + " " + Integer.toBinaryString(0xFF & a[1]));

输出

[-127, -82]
10000001 10101110

即 -127 == 0xb10000001 和 -82 == 0xb10101110

于 2013-09-24T07:48:57.433 回答
2

用于putShort放置一个两个字节的值。int有四个字节。

// big endian is the default order
byte[] xByte = ByteBuffer.allocate(2).putShort((short)aInt).array();

顺便说一句,你的第一次尝试是完美的。由于设置了这些字节的最高有效位,因此您无法更改字节的负号。这总是被解释为负值。

100000012 == -127

10101110₂ == -82

于 2013-09-24T07:49:04.237 回答
2

字节是有符号的 8 位整数。因此,您的结果是完全正确的。即:01111111 是 127,但 10000000 是 -128。如果要获取 0-255 范围内的数字,则需要使用更大的变量类型,例如 short。

您可以像这样将字节打印为无符号:

public static String toString(byte b) {
    return String.valueOf(((short)b) & 0xFF);
}
于 2013-09-24T08:01:34.590 回答
2

你得到的答案

 xByte[0] :-127
 xByte[1] :-82

是正确的。

这称为 2 的恭维表示。第 1 位用作有符号位。

0 for +ve
1 for -ve

如果第 1 位为 0,则计算为常规。但是如果第 1 位是 1,那么它会从 128 中减去 7 位的值,并且答案以 -ve 形式呈现。

在您的情况下10000001 ,-ve 和 128 - 1(最后七位)= 127 的第一个值是 1(第一个位),所以值是 -127

有关更多详细信息,请阅读 2 的补码表示。

于 2013-09-24T08:39:41.197 回答