Как конвертировать BigInteger в строку в Java - PullRequest
28 голосов
/ 12 июня 2010

Я преобразовал 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(), но это дает мне желаемый результат.

Почему? Где ошибка и что я могу с этим сделать?

Ответы [ 9 ]

26 голосов
/ 12 июня 2010

Вы хотите использовать 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[]), которые указывают явное кодирование, в противном случае вы можете столкнуться с проблемами кодирования.

8 голосов
/ 12 июня 2010

Почему вы не используете конструктор BigInteger(String)?Таким образом, циклическое переключение по toString() должно работать нормально.

(обратите внимание также, что ваше преобразование в байты явно не определяет кодировку символов и зависит от платформы - это может стать источником горя в дальнейшемпо линии)

7 голосов
/ 22 октября 2013

Вы также можете использовать неявное преобразование Java:

BigInteger m = new BigInteger(bytemsg); 
String mStr = "" + m;  // mStr now contains string representation of m.
7 голосов
/ 12 июня 2010

Используйте m.toString() или String.valueOf(m). String.valueOf использует toString (), но является нулевым.

2 голосов
/ 22 июня 2013

При создании BigInteger со строкой строка должна быть отформатирована как десятичное число.Вы не можете использовать буквы, если вы не укажете основание во втором аргументе, вы можете указать до 36 в основание.36 даст вам буквенно-цифровые символы только [0-9, az], поэтому, если вы используете это, у вас не будет форматирования.Вы можете создать: new BigInteger ("ihavenospaces", 36). Затем, чтобы преобразовать обратно, используйте .toString (36)

, НО ДЛЯ ФОРМАТИРОВАНИЯ: используйте метод byte [], который упомянули несколько человек.Это позволит упаковать данные с форматированием в наименьший размер и позволит вам легко отслеживать количество байтов

Это должно быть идеально для примера программы криптосистемы с открытым ключом RSA, при условии, что вы сохраняете количество байтовв сообщении меньше, чем количество байтов PQ

(я понимаю, что эта ветка старая)

1 голос
/ 12 июня 2010

Для реверса

byte[] bytemsg=msg.getBytes(); 

вы можете использовать

String text = new String(bytemsg); 

использование BigInteger просто усложняет ситуацию, на самом деле не ясно, зачем вам байт []. Что планируете делать с BigInteger или byte []? Какой смысл?

0 голосов
/ 18 марта 2018

// Как решить 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); 
0 голосов
/ 27 июля 2012
String input = "0101";
BigInteger x = new BigInteger ( input , 2 );
String output = x.toString(2);
0 голосов
/ 12 июня 2010

http://java.sun.com/j2se/1.3/docs/api/java/lang/Object.html

каждый объект имеет метод toString () в Java.

...