我将String
转换为BigInteger
,如下所示:
Scanner sc=new Scanner(System.in);
System.out.println("enter the message");
String msg=sc.next();
byte[] bytemsg=msg.getBytes();
BigInteger m=new BigInteger(bytemsg);
现在我想要我的字符串了。我正在使用m.toString()
,但这给了我想要的结果。
为什么呢?错误在哪里,我该怎么办?
答案 0 :(得分:25)
String msg = "Hello there!";
BigInteger bi = new BigInteger(msg.getBytes());
System.out.println(new String(bi.toByteArray())); // prints "Hello there!"
我理解的方式是你正在进行以下转换:
String -----------------> byte[] ------------------> BigInteger
String.getBytes() BigInteger(byte[])
你想要反过来:
BigInteger ------------------------> byte[] ------------------> String
BigInteger.toByteArray() String(byte[])
请注意,您可能希望使用指定显式编码的String.getBytes()
和String(byte[])
重载,否则可能会遇到编码问题。
答案 1 :(得分:8)
为什么不使用BigInteger(String)
构造函数?这样,通过toString()
进行往返应该可以正常工作。
(另请注意,您转换为字节并未明确指定字符编码并且与平台有关 - 这可能会让您感到悲伤)
答案 2 :(得分:7)
使用m.toString()
或String.valueOf(m)
。 String.valueOf使用toString()但是为null安全。
答案 3 :(得分:7)
您还可以使用Java的隐式转换:
BigInteger m = new BigInteger(bytemsg);
String mStr = "" + m; // mStr now contains string representation of m.
答案 4 :(得分:2)
使用字符串构造BigInteger时,字符串必须格式化为十进制数字。您不能使用字母,除非您在第二个参数中指定基数,您可以在基数中指定最多36个。 36将仅为您提供字母数字字符[0-9,a-z],因此如果使用此字符,您将没有格式化。你可以创建:new BigInteger(“ihavenospaces”,36) 然后转换回来,使用.toString(36)
但要保持格式化: 使用几个人提到的byte []方法。这将把格式化的数据打包成最小的大小,并允许您轻松跟踪字节数
这对于RSA公钥加密系统示例程序应该是完美的,假设您保持消息中的字节数小于PQ的字节数
(我意识到这个线程已经老了)
答案 5 :(得分:1)
要反转
byte[] bytemsg=msg.getBytes();
你可以使用
String text = new String(bytemsg);
使用BigInteger只会使事情变得复杂,实际上不清楚为什么要使用byte []。与BigInteger或byte []有什么关系?有什么意义?
答案 6 :(得分:0)
http://java.sun.com/j2se/1.3/docs/api/java/lang/Object.html
每个对象在Java中都有一个toString()方法。
答案 7 :(得分:0)
//如何解决BigDecimal& BigInteger并返回一个String。
BigDecimal x = new BigDecimal( a );
BigDecimal y = new BigDecimal( b );
BigDecimal result = BigDecimal.ZERO;
BigDecimal result = x.add(y);
return String.valueOf(result);