如何在Java中将字符串转换为BigInteger表示形式并进行反向转换?

4
假设我有一个字符串,称为foo。这个字符串可以包含任何值,如字母、数字、特殊字符和UTF-8特殊字符,例如á等。例如,这可能是一个真实的值:
"Érdekes szöveget írtam a tegnap, 84 ember olvasta."

我希望有以下两种方法:

public BigInteger toBigInteger(String foo)
{
    //Returns a BigInteger value that can be associated with foo
}

public String fromBigInteger(BigInteger bar)
{
    //Returns a String value that can be associated with bar
}

然后:

String foo = "Érdekes szöveget írtam a tegnap, 84 ember olvasta.";
System.out.println(fromBigInteger(toBigInteger(foo)));
//Output should be: "Érdekes szöveget írtam a tegnap, 84 ember olvasta."

我该如何实现这个?谢谢。

4
为什么要使用 BigInteger 呢?它似乎不是一个很自然的目标数据类型。 - Jon Skeet
我有一个算法,可以加密和解密一个大数,该大数表示为BigInteger。实际上,要加密或解密的数字实际上是文本消息。因此,在高层次上,我打算使用字符串作为输入,并获得该字符串的加密版本。之后,在解密时,我打算使用加密消息并将其解密为另一个字符串。在低层次上,我正在处理数字,在高层次上,我正在处理字符串。 - Lajos Arpad
3
最好让你的加密代码与 byte[] 兼容,这是常规方法。将不同数据类型转换为任意二进制数据是一种常见操作,而将它们转换为 BigInteger 则不是。 - Jon Skeet
我认为重点是对数据进行加密。当然,自己设计加密方案通常是一个不好的开始。你如何实现这一点是你的事情,但是看看所有其他加密API——它们可以处理任意二进制数据,这不是巧合。 - Jon Skeet
谢谢您的分享,@JonSkeet。我会考虑使用字节数组实现,并涉及到256进制数字的方法,但是目前我还是会坚持使用BigInteger。 - Lajos Arpad
显示剩余2条评论
2个回答

11
以下代码将实现您的期望:
public BigInteger toBigInteger(String foo)
{
    return new BigInteger(foo.getBytes());
}

public String fromBigInteger(BigInteger bar)
{
    return new String(bar.toByteArray());
}

不过我不理解为什么你需要这样做,我很想听听你的解释。


这看起来很棒,我希望它能正常工作。我会尝试一下并告诉您结果。谢谢。 - Lajos Arpad
1
在我看来应该指定编码方式 - 这将会导致任何以 U+0000 开头的字符串出现错误。 - Jon Skeet
1
可能他需要它用于加密目的。 - nervosol
可以做类似的事情,但是使用整数而不是大整数吗? - ammf18

4
忽略“你为什么要这样做?”
String foo = "some text";
byte[] fooBytes = foo.getBytes();
BigInteger bi = new BigInteger(fooBytes);

然后

foo = new String(bi.toByteArray());

从评论中编辑: 这是使用默认字符集。 如果源String未通过您的默认编码进行编码,则需要指定适当的Charset以便同时使用getBytes()String的构造函数。 如果恰好使用的字符集的第一个字节为零,则此操作将失败。


1
在从String -> byte[] -> String转换时,应该明确指定UTF-8作为字符集。这很可能不是平台默认值。 - Aurand
一定要明确指定UTF-8。如果最终出现前导零,这将失败。 - Jon Skeet
我考虑过这个问题,但实际上应该使用默认字符集。如果字符串不是UTF-8怎么办?关于前导零...哪种字符集在第一个字节中使用零?我不知道有哪个字符集使用零。 - Brian Roach
@BrianRoach:每个良好构造的Java字符串都可以用UTF-8表示。但并非所有编码都是如此。另外,如果OP需要在一台机器上加密,在另一台机器上解密,则编码可能不同。U+0000也是一个完全有效的Unicode字符。 - Jon Skeet

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