如何在Java中将二进制字符串转换为2字节的字节数组

6

我有一个二进制字符串String A = "1000000110101110",我想将该字符串转换成长度为2的字节数组在Java中。

我参考了这个链接的帮助。

我尝试了各种方法将其转换为字节。

  1. I have converted that string into decimal first and then apply the code to store into the byte array

    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)

现在我应该怎么样将二进制字符串转换为两个字节的字节数组?Java 中是否有任何内置函数可以获取字节数组?

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。


这更加紧凑,但与提问者在第一次尝试中所做的没有区别。 - Holger
我已经尝试了你的方法 byte[] xByte = {(byte) ( aInt >> 8), (byte) aInt}; 但是存储在第零个位置的值仍然是负数 xByte[0] :-127 - rachana
@rachana:这不会改变。请看我的回答。 - Holger

2

字节是有符号的8位整数。因此,你的结果完全正确。也就是说:01111111是127,但10000000是-128。如果你想获得0-255范围内的数字,你需要使用一个更大的变量类型,比如short。

你可以像这样打印字节作为无符号值:

public static String toString(byte b) {
    return String.valueOf(((short)b) & 0xFF);
}

你能举个例子来解释一下吗? - rachana
解释什么?如何使用shorts?只需将byte []替换为short [],并将(byte)强制转换替换为(short)强制转换即可获得0-255值。Java byte 表示范围在[-128,127]之间的数字。 - RokL
但是我想要字节数组,如果我使用short[]替换byte[],它会给出short[],这不是我想要的。 - rachana
对于字节数组,每个元素代表256个可能的值,就算是在算术运算中也只能在-128到127的范围内。Java内置函数将使用这些值来打印字符串。如果需要,您可以自己将字节打印为0-255的字符串。我会编辑我的答案并提供一个打印该范围内字节的函数。 - RokL

2
你得到的答案
 xByte[0] :-127
 xByte[1] :-82

这被称为二进制补码表示法。

第一位用作符号位。

is right.

0 for +ve
1 for -ve

如果第一位是0,则按照常规计算。但如果第一位是1,则从128中减去7位的值,无论答案如何都以负数形式呈现。
在您的情况下, 第一个值为10000001 所以1(第一位)表示负数,128-1(最后七位)= 127 因此该值为-127。
要了解更多详细信息,请阅读二进制补码表示法。

2

使用putShort放置两个字节大小的值。 int有四个字节。

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

顺便说一下,你的第一次尝试很完美。你无法更改这些字节的负号,因为这些字节的最高有效位已设置。它总是被解释为负值。
10000001₂ == -127
10101110₂ == -82

你能举个例子来解释一下吗? - rachana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接