【问题标题】:How to convert binary string to the byte array of 2 bytes in java如何在java中将二进制字符串转换为2字节的字节数组
【发布时间】:2013-09-29 07:46:44
【问题描述】:

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

我已经得到this链接的帮助

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

  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 中是否有任何内置函数来获取字节数组

【问题讨论】:

    标签: java binary byte bytearray binary-data


    【解决方案1】:

    你得到的答案

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

    是对的。

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

    0 for +ve
    1 for -ve
    

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

    在你的情况下 第一个值为10000001 所以 1(第 1 位)代表 -ve 和 128 - 1(最后 7 位)= 127 所以值为-127

    更多细节请阅读 2 的补码表示。

    【讨论】:

      【解决方案2】:

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

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

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

      100000012 == -127

      10101110₂ == -82

      【讨论】:

      • 你能举个例子解释一下吗?
      【解决方案3】:

      试试这个

      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

      【讨论】:

      • 这更紧凑,但与提问者在第一次尝试中所做的没有什么不同。
      • 我用你的方法试过byte[] xByte = {(byte) ( aInt >> 8), (byte) aInt};但是第0位存储的值还是负数xByte[0] :-127
      • @rachana:这不会改变。看我的回答。
      【解决方案4】:

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

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

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

      【讨论】:

      • 你能举个例子解释一下吗?
      • 解释什么?如何使用短裤?只需将 byte[] 替换为 short[] 并将 (byte) casts 替换为 (short) casts,您将获得 0-255 个值。 Java 字节表示 [-128, 127] 范围内的数字。
      • 但是我想要字节数组,如果我使用 short[] 替换 byte[] 它会给出 short[] 而这不是我想要的
      • 与字节数组一样,每个元素代表 256 个可能的值,就算术运算而言,它们在 -128 到 127 的范围内。将它们打印到 String 的 java 内置函数也将使用这些值。如果需要,您可以自己将字节打印到 0-255 字符串。我将使用在该范围内打印一个字节的函数来编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 2014-07-03
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      相关资源
      最近更新 更多