2010-06-12 16 views
23

que convirtieron un String a BigInteger de la siguiente manera:cómo convertir BigInteger de cadena en Java

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); 

Ahora quiero mi cadena de nuevo. Estoy usando m.toString() pero eso me está dando el resultado deseado.

¿Por qué ??? ¿Dónde está el error y qué puedo hacer al respecto?

+2

Si entiendo sus comentarios derecha, el MSG no es necesariamente un número. Creo que la mayoría de nosotros creemos que msg debe ser la cadena que representa un número (como "12345"). Pero lo que quiere hacer es convertir "hola" a algún número y ser capaz de reconstruir la cadena original nuevamente. preguntándose por qué querrías hacer eso ... La conversión de cadena de IMO a BigInteger de esta manera solo tiene sentido si quieres hacer cálculos con el número resultante, pero luego convertirlo no tendría sentido. ¿Qué me estoy perdiendo? – Axel

+0

realmente estoy haciendo un programa en criptosistema RSA y en su momento necesitaba convertir msg a BigInteger (durante la inscripción) y de nuevo el proceso inverso durante la descripción. Pero deberías responder sin saber la razón por la que estoy haciendo, porque todo puede ' se explicará aquí – condinya

Respuesta

20

que desea utilizar BigInteger.toByteArray()

String msg = "Hello there!"; 
BigInteger bi = new BigInteger(msg.getBytes()); 
System.out.println(new String(bi.toByteArray())); // prints "Hello there!" 

La manera en que yo entiendo que es lo que están haciendo las siguientes transformaciones:

String -----------------> byte[] ------------------> BigInteger 
      String.getBytes()   BigInteger(byte[]) 

y desea que el inverso:

BigInteger ------------------------> byte[] ------------------> String 
      BigInteger.toByteArray()   String(byte[]) 

Tenga en cuenta que probablemente desee utilizar sobrecargas de String.getBytes() y String(byte[]) que especifica una codificación explícita; de lo contrario, puede encontrarse con problemas de codificación.

+3

Acabo de probar esto hoy y parece que no funciona. Recupero un BigInteger después de muchas conversiones, intento hacer esto y me da una secuencia de basura. –

+0

¡No funciona! –

+0

¡Esto no funciona! – user3000430

6

Utilice m.toString() o String.valueOf(m). String.valueOf usa toString() pero no es seguro.

+0

intenté ambos. Si mi mensaje es hola, en ambos casos obtengo su valor de BigInteger 448378203247 .pero no quiero el número entero – condinya

+1

Si el BigInteger representa una cadena, no parece haber ningún valor para convertirlo en un byte [] o BigInteger. ¿Por qué necesitas hacer eso? – krock

8

¿Por qué no usa el constructor BigInteger(String)? De esta forma, el disparo circular a través de toString() debería funcionar bien.

(nota también de que su conversión en bytes no especifica explícitamente una codificación de caracteres y es dependiente de la plataforma - que podría ser fuente de dolor más abajo en la línea)

+1

si estoy usando el constructor BigInteger (String) estoy obteniendo la excepción: java.lang.NumberFormatException – condinya

1

Para invertir

byte[] bytemsg=msg.getBytes(); 

puede utilizar

String text = new String(bytemsg); 

utilizando un BigInteger solo complica las cosas, de hecho, no está claro por qué quiere un byte []. ¿Qué se puede hacer con BigInteger o byte []? ¿Cual es el punto?

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

Cuando se construye un BigInteger con una cadena, la cadena debe estar formateada como un número decimal. No puede usar letras, a menos que especifique una raíz en el segundo argumento, puede especificar hasta 36 en la raíz. 36 le dará caracteres alfanuméricos solamente [0-9, a-z], por lo que si usa esto, no tendrá formateo. Puede crear: nueva BigInteger ("ihavenospaces", 36) Entonces convertir de nuevo, utilizar un .toString (36)

pero para mantener FORMATEO: Utilice los botones [] método de bytes que un par de personas mencionadas.Eso empaquetará los datos con formato en el tamaño más pequeño, y le permitirá hacer un seguimiento del número de bytes fácilmente

Eso debería ser perfecto para un programa de ejemplo de sistema criptográfico de clave pública RSA, suponiendo que mantenga el número de bytes en el mensaje más pequeño que el número de bytes de PQ

(I dan cuenta de este hilo es viejo)

+0

¡Interesante idea! –

5

también puede utilizar la conversión implícita de Java:

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