Re: BigInteger Class
On Fri, 21 Mar 2008 07:29:33 GMT, Roedy Green
<see_website@mindprod.com.invalid> wrote:
The problem is the internal form and external human-readable form are
quite different and it takes quite a bit of computation to
interconvert them. Your only hope is to find some representation that
takes less effort to export, e.g. hex.
Another approach is to get a HEX editor and look at a binary dump of
the file recorded in some internal binary format the way we used to in
the olden days.
Ok... have a look at this version. It doesn't work exactly (especially
if you increase the length of the BigInteger. I am not sure where
exactly the problem is. If you can fix it, post the version
import java.io.*;
import java.math.*;
import java.util.*;
public class BigNumber {
public static void main(String[] args) throws Exception
{
FileWriter fstream = new FileWriter("number.txt");
BufferedWriter fout = new BufferedWriter(fstream);
PrintWriter out = new PrintWriter (fout);
BigInteger bigInteger = new BigInteger (30,new Random());
System.out.println(bigInteger);
byte[] byteArray = bigInteger.toByteArray();
int[] intArray = byteArrayToIntArray(byteArray, byteArray[0] <
0 ? -1 : 0);
for (int i : intArray)
{
System.out.println(i);
out.print(i);
}
out.flush();
}
/** Convert a big-endian byte array to a little-endian array of words.
*/
private static int[] byteArrayToIntArray(byte[] bytes, int sign)
{
// Determine number of words needed.
int[] words = new int[bytes.length/4 + 1];
int nwords = words.length;
// Create a int out of modulo 4 high order bytes.
int bptr = 0;
int word = sign;
for (int i = bytes.length % 4; i > 0; --i, bptr++)
word = (word << 8) | (bytes[bptr] & 0xff);
words[--nwords] = word;
// Elements remaining in byte[] are a multiple of 4.
while (nwords > 0)
words[--nwords] = bytes[bptr++] << 24 |
(bytes[bptr++] & 0xff) << 16 |
(bytes[bptr++] & 0xff) << 8 |
(bytes[bptr++] & 0xff);
return words;
}
}