2016-09-27 385 views
-3

首先,请不要标记为重复的,因为我知道另一个SO帖子不能解决我的问题..谢谢。将二进制字符串转换为文本字符串

我有一个String变量称为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 

我想给String变量M从二进制转换为文本。在我的理解为主,而对其他SO帖子阅读,我编写了以下内容:

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值是否过大?有关为什么以及如何纠正这个问题的任何建议,我们都很感激。

UPDATE: 此外有关错误的详细信息:

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

* 194线是:

int charCode = Integer.parseInt(M.trim(), 2); 

更新#2:(我改变resultresult1) 考虑,

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

错误是:

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

更新#3:

错误校正,但我接收到字符串:

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}{ 

当我应该接收所述串:

ribqkjnwyysrecjqeasygtrxauwnxcsvnwmssfhshxtilaonilatiyrebpxxecrcfffbenlnahpvjdqtabygyjsqkfgsswgpvceaifbqjexjlzmtaqbnueidfgohsjwzzbsnfqwsjtwowpjsupemmcffhsmxyftdrgfozxhzbxjarfqcsembypbhigowvahqzuttfeijupsaulgxlwlacugccicoawgysueeyopiumkbbercwdnjoohvdcsiqsbd 

UPDATE#4 :

当removi ng 96,我收到以下内容:

enter image description here 这是什么?

+0

实际上有一个字符串没有限制。您的字符串非常短,与业务中使用的字符相比较。请提供您的错误的详细信息。 –

+0

尝试通过空格分割输入字符串并处理每个部分。 –

+0

@NikolasCharalambidis好的。请参阅我的更新,提供有关错误的所有详细信息。 – SamSmith

回答

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... 
+0

如果你看看这些值,就像'96 + charCode'一样。 –

+0

请看我的更新,因为我收到此代码的错误。谢谢。 – SamSmith

+0

它已更新,我还添加了96作为@Joop指出。如果这不起作用,你应该尝试删除96. –

-1

我不能完全肯定。但看起来对我而言。

什么youre做是印刷在一行

等的0001101 = R,0010110 = I,0011101 = B信值每个二进制代码字母等

这些数字的第一个3二进制值和字母您的前3个字符串值

+0

00001101不是'r',它是回报。 0010110不是我,它是文件分隔符Escape。 0011101不是b,它是组分隔符。 – zaph

+0

这是否意味着字符串值r = carrage return? 我想知道0000110是什么。我不会惊讶,如果它不是“Y” – alanin

+0

@alanin不是它意味着价值0b00001101 ascii字符是回车。 –

0

这些数字表示不可打印字符(值为< 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() 
相关问题