Java 连接字符';把它串成一条线
我有一个方法,它取一个BigInteger,生成另一个BigInteger(通过rsa算法),然后转换成二进制,然后分成8块,在那里我得到二进制字符串的ascii值 所有这些都有效 但是我很难从每个二进制字符串中获取ascii字符,并从中生成一个新字符串。我试图使用内置的concat方法,但它似乎不起作用Java 连接字符';把它串成一条线,java,Java,我有一个方法,它取一个BigInteger,生成另一个BigInteger(通过rsa算法),然后转换成二进制,然后分成8块,在那里我得到二进制字符串的ascii值 所有这些都有效 但是我很难从每个二进制字符串中获取ascii字符,并从中生成一个新字符串。我试图使用内置的concat方法,但它似乎不起作用 public static String Decrypt( BigInteger ct, BigInteger d, BigInteger mod ){ String pt
public static String Decrypt( BigInteger ct, BigInteger d, BigInteger mod ){
String pt = null;
BigInteger message = ct.modPow(d, mod); //the decrypted message M but still in BigInteger form
String plaintext = message.toString(2);
if( plaintext.length() % 8 != 0 ){
plaintext = "00000000".substring( plaintext.length() % 8 ) + plaintext;
}
String c;
int charCode = 0;
for( int i = (plaintext.length()/8) - 1 ; i >= 0; i--){
charCode = Integer.parseInt((plaintext.substring(i*8, (i*8)+8)) , 2) ;
c = new Character( (char) charCode).toString();
System.out.print(c); // here is where i need something like pt.concat(c) or something like that, I dont really want it printed
} // i just want all of these chars to be put into the string pt
System.out.println();
return pt;
}
正如您在我所说的评论中所看到的,我的意思是,通过查看concat的API,我所做的似乎是正确的,但它就是不起作用
如果你能解释/说明问题所在,谢谢 1。您应该使用StringBuilder将字符附加到 二,。您的代码创建了很多字符串:
纯文本。子字符串(i*8,(i*8)+8))
下面是修复这两个问题的代码
public static void main(String... args) {
String plaintext = "";
{ // preparing for test
String input = "abc";
for (char ch : input.toCharArray()) {
String charAs8bits = String.format("%8s",
String.valueOf(Integer.toBinaryString(ch))).replace(
' ', '0');
plaintext = charAs8bits + plaintext;
}
System.out.println("plaintext = " + plaintext);
}
StringBuilder output = new StringBuilder();
for (int i = plaintext.length() - 8; i >= 0; i -= 8) {
boolean isDigit = Character.isDigit(plaintext.charAt(i)) //
&& Character.isDigit(plaintext.charAt(i + 1)) //
&& Character.isDigit(plaintext.charAt(i + 2)) //
&& Character.isDigit(plaintext.charAt(i + 3)) //
&& Character.isDigit(plaintext.charAt(i + 4)) //
&& Character.isDigit(plaintext.charAt(i + 5)) //
&& Character.isDigit(plaintext.charAt(i + 6)) //
&& Character.isDigit(plaintext.charAt(i + 7)) //
;
if (isDigit) {
int num = (Character.digit(plaintext.charAt(i), 2) << 7) //
+ (Character.digit(plaintext.charAt(i + 1), 2) << 6) //
+ (Character.digit(plaintext.charAt(i + 2), 2) << 5) //
+ (Character.digit(plaintext.charAt(i + 3), 2) << 4) //
+ (Character.digit(plaintext.charAt(i + 4), 2) << 3) //
+ (Character.digit(plaintext.charAt(i + 5), 2) << 2) //
+ (Character.digit(plaintext.charAt(i + 6), 2) << 1) //
+ (Character.digit(plaintext.charAt(i + 7), 2)) //
;
output.append((char) num);
}
}
System.out.print("output = " + output);
}
UPD
我还将循环的
更改为对我来说更自然的视图-因此I
指向“基本”索引。1。您应该使用StringBuilder将字符附加到
二,。您的代码创建了很多字符串:纯文本。子字符串(i*8,(i*8)+8))
下面是修复这两个问题的代码
public static void main(String... args) {
String plaintext = "";
{ // preparing for test
String input = "abc";
for (char ch : input.toCharArray()) {
String charAs8bits = String.format("%8s",
String.valueOf(Integer.toBinaryString(ch))).replace(
' ', '0');
plaintext = charAs8bits + plaintext;
}
System.out.println("plaintext = " + plaintext);
}
StringBuilder output = new StringBuilder();
for (int i = plaintext.length() - 8; i >= 0; i -= 8) {
boolean isDigit = Character.isDigit(plaintext.charAt(i)) //
&& Character.isDigit(plaintext.charAt(i + 1)) //
&& Character.isDigit(plaintext.charAt(i + 2)) //
&& Character.isDigit(plaintext.charAt(i + 3)) //
&& Character.isDigit(plaintext.charAt(i + 4)) //
&& Character.isDigit(plaintext.charAt(i + 5)) //
&& Character.isDigit(plaintext.charAt(i + 6)) //
&& Character.isDigit(plaintext.charAt(i + 7)) //
;
if (isDigit) {
int num = (Character.digit(plaintext.charAt(i), 2) << 7) //
+ (Character.digit(plaintext.charAt(i + 1), 2) << 6) //
+ (Character.digit(plaintext.charAt(i + 2), 2) << 5) //
+ (Character.digit(plaintext.charAt(i + 3), 2) << 4) //
+ (Character.digit(plaintext.charAt(i + 4), 2) << 3) //
+ (Character.digit(plaintext.charAt(i + 5), 2) << 2) //
+ (Character.digit(plaintext.charAt(i + 6), 2) << 1) //
+ (Character.digit(plaintext.charAt(i + 7), 2)) //
;
output.append((char) num);
}
}
System.out.print("output = " + output);
}
UPD
我还将for
循环更改为对我来说更自然的视图-以便I
指向“基本”索引。首先,请注意String pt=null
,因此您将获得一个空点。其次,您可以设置String pt=”“代码>且具有pt+=c代码>位于感兴趣的位置。另外,您可以跳过c=newcharacter(…)
,只需执行以下操作:pt++(char)charCode代码>但是concat不就可以去掉空值吗?谢谢你,伙计。如果你能给我一个答案,我会投赞成票:D工作得很有魅力!您使用二进制数字符号的字符串表示法的方法非常好。不过,如果你想要表现,我建议你使用。如果第一个字节为零,则删除它。然后使用剩余的字节来创建。这将短得多,速度也快得多,但如果出现任何错误,调试将更加困难。首先,请注意String pt=null
,因此您将得到一个空指针。其次,您可以设置String pt=“”代码>且具有pt+=c代码>位于感兴趣的位置。另外,您可以跳过c=newcharacter(…)
,只需执行以下操作:pt++(char)charCode代码>但是concat不就可以去掉空值吗?谢谢你,伙计。如果你能给我一个答案,我会投赞成票:D工作得很有魅力!您使用二进制数字符号的字符串表示法的方法非常好。不过,如果你想要表现,我建议你使用。如果第一个字节为零,则删除它。然后使用剩余的字节来创建。这将是一个短得多,快得多,但更难以调试的情况下出现任何错误。