Java 将二进制字符串解析为文本/字符

Java 将二进制字符串解析为文本/字符,java,Java,我可能忽略了一些愚蠢的事情,但我从来没有在代码中处理过二进制代码,我认为在加密程序中实践二进制代码是个好主意。 长话短说,我能够以字符串的形式将字符串转换为二进制,但不知道如何进行相反的转换 现在,我有这样的想法: public static String bytesToString(String bytes){ int i = bytes.length()/8; int pos = 0; String result = ""; for(int j=0; j<

我可能忽略了一些愚蠢的事情,但我从来没有在代码中处理过二进制代码,我认为在加密程序中实践二进制代码是个好主意。 长话短说,我能够以字符串的形式将字符串转换为二进制,但不知道如何进行相反的转换

现在,我有这样的想法:

public static String bytesToString(String bytes){
    int i = bytes.length()/8;
    int pos = 0;
    String result = "";
    for(int j=0; j<i; j++){
        String temp = bytes.substring(pos,pos+8);
        byte b = (byte) Integer.parseInt(temp);
        result = result + Byte.toString(b);
        pos++;
    }
    System.out.println("Result: " + result);
    return result;
}
我认为字节被解析为文字数字。我错过了什么? 编辑:为了澄清,我之前已经将一个文本字符串解析为位,并将它们写入一个字符串。我想将这个字符串拆分成字节,并将它们解析回字母。需要011010110010101111001然后返回hey。

使用如何?如:

我不知道为什么您的binaryToString方法既接受字符串又返回字符串。

如何使用?如:


我不确定您的binaryToString方法为什么同时获取并返回字符串。

Integer.parseInttemp将尝试将temp读取为数字并返回相应的int。例如,Integer.parseInt123返回123

编辑:请注意,字符或文本的二进制值取决于您使用的编码。例如,hi在ASCII中为01101001001,但在UTF-16或UTF-32中可能不是。Java将字符编码为UTF-16字符:参见 因此,Java字符是16位无符号整数

因此,bytesToString方法必须根据输入的编码对输入进行不同的处理。或者您可以专门为ASCII字符编写它,也可以将其重命名为(比如)asciiBytesToString

你最好看看:

构造函数Stringbyte[] Integer.parseIntString,整数基数
Integer.parseInttemp将尝试将temp读取为一个数字并返回相应的int。例如,Integer.parseInt123返回123

编辑:请注意,字符或文本的二进制值取决于您使用的编码。例如,hi在ASCII中为01101001001,但在UTF-16或UTF-32中可能不是。Java将字符编码为UTF-16字符:参见 因此,Java字符是16位无符号整数

因此,bytesToString方法必须根据输入的编码对输入进行不同的处理。或者您可以专门为ASCII字符编写它,也可以将其重命名为(比如)asciiBytesToString

你最好看看:

构造函数Stringbyte[] Integer.parseIntString,整数基数
你需要一次前进8位数,而不是一位数一位数地前进。否则,您将重用位。另外,您需要告诉Integer.parseInt您想要使用的基数,因为parseIntString val不能真正检测您想要的二进制数Integer.parseIntString val,int基数。您还需要选择一种字符编码来将字节转换为字符—它们不是一回事!。假设ISO-8859-1正常:

public static String bytesToString(String bytes){
    int i = bytes.length()/8;
    int pos = 0;
    String result = "";
    byte[] buffer = new byte[i];
    for(int j=0; j<i; j++){
        String temp = bytes.substring(pos,pos+8);
        buffer[j] = (byte) Integer.parseInt(temp, 2);
        pos+=8;
    }
    result = new String(buffer, "ISO-8859-1");
    System.out.println("Result: " + result);
    return result;
}

你需要一次前进8位数,而不是一位数一位数地前进。否则,您将重用位。另外,您需要告诉Integer.parseInt您想要使用的基数,因为parseIntString val不能真正检测您想要的二进制数Integer.parseIntString val,int基数。您还需要选择一种字符编码来将字节转换为字符—它们不是一回事!。假设ISO-8859-1正常:

public static String bytesToString(String bytes){
    int i = bytes.length()/8;
    int pos = 0;
    String result = "";
    byte[] buffer = new byte[i];
    for(int j=0; j<i; j++){
        String temp = bytes.substring(pos,pos+8);
        buffer[j] = (byte) Integer.parseInt(temp, 2);
        pos+=8;
    }
    result = new String(buffer, "ISO-8859-1");
    System.out.println("Result: " + result);
    return result;
}

因为我想回信。例如,二进制的hi是011010011001。我会给出这个方法01101001001,希望它能被拆分成011010001001,然后作为hi返回。在这种情况下,我强烈建议使用和,而不是尝试使用自己的方法。将字符串存储为字符串,将字节数组存储为字节数组。因为我想返回字母。例如,二进制的hi是011010011001。我会给出这个方法01101001001,希望它能被拆分成011010001001,然后作为hi返回。在这种情况下,我强烈建议使用和,而不是尝试使用自己的方法。将字符串存储为字符串,将字节数组存储为字节数组。能否请您发布一个您试图实现的示例?我强烈建议将未加密字符串存储为java.lang.strings,并将二进制字符串(例如字符串的二进制表示形式)存储为byte[]。将3个字节011010000011001010111001存储在字符串中作为011010010101111001而不是hey占用的空间是16倍,因为Java在内部表示字符串为UTF-16,这意味着每个字符存储为2个字节。更糟糕的是,代码的含义被模糊了,这个字符串是真字符串还是字节字符串?性能也会受到影响。你能举一个例子说明你想要实现什么吗?我强烈建议将未加密的字符串存储为java.lang.strings,并将二进制字符串(例如字符串的二进制表示形式)存储为byte[]。将3个字节011010000011001010111001存储在字符串中作为011010010101111001而不是hey占用的空间是16倍,因为Java在内部表示字符串为UTF-16,这意味着每个字符存储为2个字节。更糟糕的是
代码的意思是模糊的,这个字符串是真字符串还是字节字符串?由于UTF-8是ASCII的严格超集,因此仅由ASCII字符组成的字符串将由ASCII和UTF-8进行相同的编码。除其他原因外,这也是使用UTF-8的一个很好的理由。是的,但是字符串表示取自Javadoc的UTF-16格式的字符串并不重要。UTF-16是java使用的内部字符串表示形式。仅由ASCII字符组成的字符串将由ASCII和UTF-8进行相同的编码,因为UTF-8是ASCII的严格超集。除其他原因外,这也是使用UTF-8的一个很好的理由。是的,但是字符串表示取自Javadoc的UTF-16格式的字符串并不重要。UTF-16是java使用的内部字符串表示形式。
public class BinaryStringToChars {
  public static void main(String[] args) {
    String bin = "011010000110010101111001";

    StringBuilder b = new StringBuilder();
    int len = bin.length();
    int i = 0;
    while (i + 8 <= len) {
      char c = convert(bin.substring(i, i+8));
      i+=8;
      b.append(c);
    }
    System.out.println(b.toString());
  }

  private static char convert(String bs) {
    return (char)Integer.parseInt(bs, 2);
  }
}