将二进制字符串转换为文本字符

时间:2016-09-27 19:39:23

标签: java string

首先,请不要将其标记为重复,因为我知道其他SO帖子无法解决我的问题。谢谢。

我有一个名为String的{​​{1}}变量,其中包含二进制值:

M

相应的文本等同于:

0001101 0010110 0011101 0001110 0010100 0010101 0010001 0001000 0000110 0000110 0001100 0001101 0011010 0011100 0010101 0001110 0011010 0011110 0001100 0000110 0011000 0001011 0001101 0000111 0011110 0001010 0001000 0010001 0000111 0011100 0001100 0001001 0010001 0001000 0010010 0001100 0001100 0011001 0010111 0001100 0010111 0000111 0001011 0010110 0010011 0011110 0010000 0010001 0010110 0010011 0011110 0001011 0010110 0000110 0001101 0011010 0011101 0001111 0000111 0000111 0011010 0011100 0001101 0011100 0011001 0011001 0011001 0011101 0011010 0010001 0010011 0010001 0011110 0010111 0001111 0001001 0010101 0011011 0001110 0001011 0011110 0011101 0000110 0011000 0000110 0010101 0001100 0001110 0010100 0011001 0011000 0001100 0001100 0001000 0011000 0001111 0001001 0011100 0011010 0011110 0010110 0011001 0011101 0001110 0010101 0011010 0000111 0010101 0010011 0000101 0010010 0001011 0011110 0001110 0011101 0010001 0001010 0011010 0010110 0011011 0011001 0011000 0010000 0010111 0001100 0010101 0001000 0000101 0000101 0011101 0001100 0010001 0011001 0001110 0001000 0001100 0010101 0001011 0001000 0010000 0001000 0001111 0010101 0001100 0001010 0001111 0011010 0010010 0010010 0011100 0011001 0011001 0010111 0001100 0010010 0000111 0000110 0011001 0001011 0011011 0001101 0011000 0011001 0010000 0000101 0000111 0010111 0000101 0011101 0000111 0010101 0011110 0001101 0011001 0001110 0011100 0001100 0011010 0010010 0011101 0000110 0001111 0011101 0010111 0010110 0011000 0010000 0001000 0001001 0011110 0010111 0001110 0000101 0001010 0001011 0001011 0011001 0011010 0010110 0010101 0001010 0001111 0001100 0011110 0001010 0010011 0011000 0000111 0010011 0001000 0010011 0011110 0011100 0001010 0011000 0011100 0011100 0010110 0011100 0010000 0011110 0001000 0011000 0000110 0001100 0001010 0011010 0011010 0000110 0010000 0001111 0010110 0001010 0010010 0010100 0011101 0011101 0011010 0001101 0011100 0001000 0011011 0010001 0010101 0010000 0010000 0010111 0001001 0011011 0011100 0001100 0010110 0001110 0001100 0011101 0011011

我正在尝试将ribqkjnwyysrecjqeasygtrxauwnxcsvnwmssfhshxtilaonilatiyrebpxxecrcfffbenlnahpvjdqtabygyjsqkfgsswgpvceaifbqjexjlzmtaqbnueidfgohsjwzzbsnfqwsjtwowpjsupemmcffhsmxyftdrgfozxhzbxjarfqcsembypbhigowvahqzuttfeijupsaulgxlwlacugccicoawgysueeyopiumkbbercwdnjoohvdcsiqsbd 变量M从二进制转换为文本。根据我的理解,并阅读其他SO帖子,我编写了以下内容:

String

其中 int charCode = Integer.parseInt(M.trim(), 2); String str = new Character((char)charCode).toString(); M,其中包含我之前讨论过的二进制值,而String应该是您在上面看到的相应文本等效项。

但是,我收到以下错误:

str

我研究了这个错误,然后添加了Exception in thread "main" java.lang.NumberFormatException: For input string: "0001101 0010110 0011101 0001110 0010100 0010101 0010001 0001000 0000110 0000110 0001100 0001101 0011010 0011100 0010101 0001110 0011010 0011110 0001100 0000110 0011000 0001011 0001101 0000111 0011110 0001010 0001000 0010001 0000111 0011100 0001100 0001001 0010001 0001000 0010010 0001100 0001100 0011001 0010111 0001100 0010111 0000111 0001011 0010110 0010011 0011110 0010000 0010001 0010110 0010011 0011110 0001011 0010110 0000110 0001101 0011010 0011101 0001111 0000111 0000111 0011010 0011100 0001101 0011100 0011001 0011001 0011001 0011101 0011010 0010001 0010011 0010001 0011110 0010111 0001111 0001001 0010101 0011011 0001110 0001011 0011110 0011101 0000110 0011000 0000110 0010101 0001100 0001110 0010100 0011001 0011000 0001100 0001100 0001000 0011000 0001111 0001001 0011100 0011010 0011110 0010110 0011001 0011101 0001110 0010101 0011010 0000111 0010101 0010011 0000101 0010010 0001011 0011110 0001110 0011101 0010001 0001010 0011010 0010110 0011011 0011001 0011000 0010000 0010111 0001100 0010101 0001000 0000101 0000101 0011101 0001100 0010001 0011001 0001110 0001000 0001100 0010101 0001011 0001000 0010000 0001000 0001111 0010101 0001100 0001010 0001111 0011010 0010010 0010010 0011100 0011001 0011001 0010111 0001100 0010010 0000111 0000110 0011001 0001011 0011011 0001101 0011000 0011001 0010000 0000101 0000111 0010111 0000101 0011101 0000111 0010101 0011110 0001101 0011001 0001110 0011100 0001100 0011010 0010010 0011101 0000110 0001111 0011101 0010111 0010110 0011000 0010000 0001000 0001001 0011110 0010111 0001110 0000101 0001010 0001011 0001011 0011001 0011010 0010110 0010101 0001010 0001111 0001100 0011110 0001010 0010011 0011000 0000111 0010011 0001000 0010011 0011110 0011100 0001010 0011000 0011100 0011100 0010110 0011100 0010000 0011110 0001000 0011000 0000110 0001100 0001010 0011010 0011010 0000110 0010000 0001111 0010110 0001010 0010010 0010100 0011101 0011101 0011010 0001101 0011100 0001000 0011011 0010001 0010101 0010000 0010000 0010111 0001001 0011011 0011100 0001100 0010110 0001110 0001100 0011101 0011011" 方法,认为它会删除任何尾随空格,但这并没有解决错误。

trim值太大了吗?关于为什么以及如何纠正这个问题的任何建议都表示赞赏。

更新: 有关错误的详细信息:

String

*第194行是:

at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at CaesarCipher.decrypt(C.java:194)

更新#2 :(我将 int charCode = Integer.parseInt(M.trim(), 2); 更改为result) 鉴于,

result1

错误是:

String result1 = "";
for(String binNum: M.trim().split(" ")){
     int charCode = Integer.parseInt(binNum, 2);
     result1+=Character.toString(charCode);
}
System.out.println(result1);

更新#3:

错误已更正,但我收到了字符串:

error: incompatible types: possible lossy conversion from int to char
     result1+=Character.toString(charCode);

当我应该收到字符串时:

mv}ntuqhfflmz|unz~lfxkmg~jhqg|liqhrllywlwgkvs~pqvs~kvfmz}oggz|m|yyy}zqsq~woiu{nk~}fxfulntyxllhxoi|z~vy}nuzguserk~n}qjzv{yxpwluhee}lqynhlukhphouljozrr|yywlrgfyk{mxypegwe}gu~myn|lzr}fo}wvxphi~wnejkkyzvujol~jsxgshs~|jx||v|p~hxfljzzfpovjrt}}zm|h{quppwi{|lvnl}{

更新#4:

删除96时,我收到以下内容:

enter image description here 这是什么?

3 个答案:

答案 0 :(得分:4)

你的问题是它不知道如何处理二进制数之间的空格,而且整个字符串本身不是一个数字,而是一组数字的分组。解决方案是将每个单独的数字解析为一个字符,然后收集结果。

你需要做这样的事情:

String result = "";
for(String binNum: M.trim().split(" ")){
     int charCode = Integer.parseInt(binNum, 2);
     result+=Character.toString((char)charCode);
}
System.out.println(result); // Here is the complete string...

答案 1 :(得分:0)

数字表示不可打印的字符(值<&lt; 32的字符)。 正如已经指出的那样,添加96可以获得可打印的内容。

这种转换可以在Java 9中完成如下:

new Scanner(M).tokens().map( n -> (char) (Integer.parseInt(n, 2) + 0x60) ).collect( StringBuilder::new, (a,b) -> a.append(b), (a,b) -> a.append(b) ).toString()

或者如果您仍在使用Java 8:

Arrays.stream( M.split(" ") ).map( n -> (char) (Integer.parseInt(n, 2) + 0x60) ).collect( StringBuilder::new, (a,b) -> a.append(b), (a,b) -> a.append(b) ).toString()

答案 2 :(得分:-1)

我不完全确定。但看起来对我来说。

您正在做的是在一行中打印每个二进制代码字母

类似于0001101 = r的字母值,0010110 = i,0011101 = b等

这些数字是前3个二进制值,字母是前3个字符串值