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);
}
}