繁体   English   中英

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

[英]Convert binary string to text string

首先,请不要标记为重复,因为我知道另一个 SO 帖子不能解决我的问题..谢谢。

我有一个名为MString变量,其中包含二进制值:

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值是否太大? 任何关于为什么和如何纠正这个问题的建议表示赞赏。

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

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:(我将result更改为result1 )鉴于,

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

更新#4:

删除 96 时,我收到以下信息:

在此处输入图片说明 这是什么?

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

你需要做这样的事情:

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

数字代表不可打印的字符(值 < 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()

我不完全确定。 但在我看来是正确的。

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

如字母值 0001101 = r、0010110 = i、0011101 = b 等。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM