2

我想将二进制字符串转换为java. 我已经编写了代码来设置二进制字符串中字节数组的每一位String A = "1000000111010000"

        private byte firstByte;
    private byte secondByte;
        byte xByte = new byte[2];

        for(int i=0 ; i<A.length() ;i++){

            if(i<8){
                System.out.println(" i : "+i+" A.char[i] :"+A.charAt(i));
                firstByte = (byte) (firstByte | (A.charAt(i) << i));
            }else{
                System.out.println(" i : "+i+" A.char[i] :"+A.charAt(i));
                secondByte = (byte) (secondByte | (A.charAt(i) << i));
            }
        }
        xByte[0] = firstByte;
        xByte[1] = secondByte;

为了编写上面的代码,我从这个链接中获得了帮助。但是该值存储在 int 中,xByte[0]并且xByte[1]不正确。它给出了像

                   xByte[0] :-15
                   xByte[1] :0

这是写入方式吗?请建议我进行更正以获得正确的字节值。

4

3 回答 3

5

只需使用Apache Commons 的BinaryCodec

 byte[] bytes = new BinaryCodec().toByteArray("1000000111010000");

   

如果您想自己进行此类转换,您的代码需要进行一些更正。
您期望A.charAt(i)它将返回数字 0 或 1,但实际上会返回char“0”或“1”。char 数据类型是单个 16 位 Unicode 字符,数值范围从 0 到 2^16,它的值正式称为 代码点
要打印代码点值,您需要将 char 转换为 int:

System.out.println("Character " + A.charAt(i) + " has a code point numeric value of " + (int)A.charAt(i));

“0”和“1”的输出:

Character 0 has a code point numeric value of 48
Character 1 has a code point numeric value of 49

 

运算符 '<<'char 操作数转换为 int,因此这种转换会产生错误的结果,因为:

firstByte = (byte) (firstByte | (A.charAt(i) << i));

是相同的

firstByte = (byte) (firstByte | ( (int)A.charAt(i) << i));

这对于 char '0' 与将值 48 向左移动相同:

firstByte = (byte) (firstByte | ( 48 << i));

 

要将 char '0' 或 '1' 转换为 0 或 1 数值,请使用 Character.getNumericValue(A.charAt(i)):

firstByte = (byte) (firstByte | ( Character.getNumericValue(A.charAt(i)) << i));

   

按价值转移i也是不正确的。您需要移动(7-i)第一个字节或(7-i%8)第二个字节。当 indexi达到 8 时,它需要从 0 开始计数,因此i%8

   

打印字节类型的值时,您有两种选择:字节数值或二进制字符串表示:

System.out.println("FIRST  byte numeric value = " + xByte[0] + ", binary string representation = " + Integer.toBinaryString((xByte[0]+256)%256));
System.out.println("SECOND byte numeric  value = " + xByte[1] + ", binary string representation = " + Integer.toBinaryString((xByte[1]+256)%256));

输出:

FIRST  byte value = -127, binary representation = 10000001
SECOND byte value = -48, binary representation = 11010000

整个更正示例:

public class ByteTest
{

  public static void main(String[] args)
  {

    byte firstByte=0;
    byte secondByte=0;

    String A = "1000000111010000";
    byte[] xByte = new byte[2];





    for(int i=0 ; i<A.length() ;i++){

      System.out.println("Character " + A.charAt(i) + " has a code point numeric value of " + (int)A.charAt(i));

      if(i<8){
        System.out.println(" i : "+i+" A.char[i] :"+A.charAt(i));
        firstByte = (byte) (firstByte | (Character.getNumericValue(A.charAt(i)) << (7-i)));
      }else{
        System.out.println(" i : "+i+" A.char[i] :"+A.charAt(i));
        secondByte = (byte) (secondByte | (Character.getNumericValue(A.charAt(i)) << (7-i%8)));
      }
    }
    xByte[0] = firstByte;
    xByte[1] = secondByte;


    System.out.println("FIRST  byte numeric value = " + xByte[0] + ", binary string representation = " + Integer.toBinaryString((xByte[0]+256)%256));
    System.out.println("SECOND byte numeric  value = " + xByte[1] + ", binary string representation = " + Integer.toBinaryString((xByte[1]+256)%256));




  }

}
于 2013-09-25T11:20:23.957 回答
4

您不能简单地将A.charAt(i)转换为int. 它将返回10ASCII 码

因此,您需要执行以下操作来获取它们的数值:-

int bit = Character.getNumericValue(A.charAt(i)); // This will give the actual value
...
firstByte = (byte) (firstByte | (bit << i));
于 2013-09-25T07:15:54.167 回答
1

A.charAt[i] 将返回一个字符,而不是一个数字,并且您将 bit 设置为一个字符值。

而是使用

if(A.charAt[i] == '0')
  firstByte = (byte) (firstByte | (0 << i));
else
   firstByte = (byte) (firstByte | (1 << i));
于 2013-09-25T07:10:32.643 回答