如何在Java中将BigInteger转换为字符串

31

我将一个 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(),但这不给我想要的结果。

为什么?哪里出了问题?我该怎么办?


4
如果我理解你的评论正确的话,你的信息并不一定是一个数字。我猜我们大多数人都认为信息应该是表示数字的字符串(比如“12345”)。但你想要做的是将“hello”转换成某个数字,并且能够重新构造出原始字符串。我想知道你为什么要这样做……在我看来,只有当你想对得到的数字进行计算时,用这种方式将字符串转换为BigInteger才有意义,但是再将它转换回去就没有意义了。我错过了什么吗? - Axel
实际上,我正在制作一个关于RSA加密系统的程序,在此过程中,我需要将消息转换为BigInteger(在加密期间),并在解密期间进行反向处理。但是您应该回答而不知道我为什么这样做,因为并不能在这里解释所有事情。 - condinya
9个回答

28

您想要使用BigInteger.toByteArray()

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[]),这些重载方法指定了明确的编码方式,否则您可能会遇到编码问题。


3
我刚在今天早些时候尝试了这个,但似乎不起作用。经过多次转换后,我得到了一个 BigInteger,然后尝试执行此操作,但结果给出了一系列垃圾数据。 - But I'm Not A Wrapper Class

10
使用 m.toString()String.valueOf(m)。String.valueOf 使用 toString(),但是它是空值安全的。

我尝试了两种方法。如果我的消息是“hello”,那么用这两种方法都会得到它们的BigInteger值448378203247。但我想要的不是整数,而是“hello”本身。 - condinya
2
如果BigInteger确实代表一个字符串,那么将其转换为byte[]或BigInteger似乎没有任何价值。你为什么需要这样做呢? - krock
当m为空时,使用String.valueOf(m)会导致NullPointerException。 - Dmitry

8
为什么不使用BigInteger(String)构造函数?这样,通过toString()进行往返转换应该可以正常工作。
(还要注意的是,您的字节转换没有明确指定字符编码并且依赖于平台 - 这可能会在以后引起问题)

2
如果我使用类似于BigInteger(String)构造函数,我会得到异常:java.lang.NumberFormatException。 - condinya
BigInteger x = new BigInteger("Hello there"); 可能不起作用。但是您可以从任何字节数组构造一个 BigInteger,即使它是从字符串派生的。 - Rudy Velthuis

7

您也可以使用Java的隐式转换:

BigInteger m = new BigInteger(bytemsg); 
String mStr = "" + m;  // mStr now contains string representation of m.

1
字符串拼接是一种非常缓慢的操作。 - Andrey Lebedenko

2
构造BigInteger时,字符串必须格式化为十进制数。除非您在第二个参数中指定基数,否则不能使用字母,您可以在基数中指定最多36个字符。 36仅会提供字母数字字符[0-9,a-z],因此如果使用此选项,则不会进行格式化。您可以创建:new BigInteger("ihavenospaces", 36)。然后要进行转换,请使用.toString(36)。
但是为了保持格式: 请使用一些人提到的byte[]方法。这将用格式将数据打包到最小大小,并使您能够轻松跟踪字节数
对于RSA公钥加密系统示例程序,这应该是完美的,假设您将消息的字节数保持小于PQ的字节数
(我意识到这个主题很旧)

1

反转

byte[] bytemsg=msg.getBytes(); 

你可以使用

String text = new String(bytemsg); 

使用BigInteger只会让事情变得更加复杂,实际上不清楚你为什么需要一个byte[]。你打算用BigInteger或byte[]做什么?这有什么意义吗?


0
String input = "0101";
BigInteger x = new BigInteger ( input , 2 );
String output = x.toString(2);

0

我使用了toString()方法,但是它打印的不是文本中的消息,而是它的BigInteger值。 - condinya

0

//如何解决BigDecimal和BigInteger并返回一个字符串。

  BigDecimal x = new BigDecimal( a );
  BigDecimal y = new BigDecimal( b ); 
  BigDecimal result = BigDecimal.ZERO;
  BigDecimal result = x.add(y);
  return String.valueOf(result); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接