2010-06-12 73 views
23

tôi chuyển đổi một String-BigInteger như sau:làm thế nào để chuyển đổi BigInteger để String trong 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); 

Bây giờ tôi muốn chuỗi của tôi trở lại. Tôi đang sử dụng m.toString() nhưng điều đó mang lại cho tôi kết quả mong muốn.

Tại sao ??? Lỗi ở đâu và tôi có thể làm gì với nó?

+2

Nếu tôi hiểu ý kiến ​​của bạn ngay, msg của bạn không phải là nhất thiết là một số. Tôi đoán hầu hết chúng ta tin rằng msg có nghĩa là chuỗi đại diện cho một số (như "12345"). Nhưng những gì bạn muốn làm là chuyển đổi "hello" thành một số và có thể tái tạo lại chuỗi gốc. tự hỏi tại sao bạn muốn làm điều đó ... IMO chuyển đổi chuỗi thành BigInteger theo cách này chỉ có ý nghĩa nếu bạn muốn tính toán với số kết quả, nhưng sau đó chuyển đổi nó trở lại sẽ không có ý nghĩa. Tôi đang thiếu gì? – Axel

+0

thực sự im thực hiện một chương trình trên hệ thống mật mã RSA và trong khóa học do tôi cần để chuyển đổi msg sang BigInteger (trong khi ghi) và một lần nữa quá trình ngược lại trong decription.but u nên trả lời nó mà không biết lý do tại sao im làm vì mọi điều có thể ' t được giải thích ở đây. – condinya

Trả lời

20

Bạn muốn sử dụng BigInteger.toByteArray()

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

Con đường tôi hiểu nó là bạn đang làm biến đổi sau:

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

Và bạn muốn điều ngược lại:

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

Lưu ý rằng bạn có thể muốn sử dụng quá tải của String.getBytes()String(byte[]) chỉ định mã hóa rõ ràng, nếu không bạn có thể gặp phải sự cố mã hóa.

+3

Chỉ cần thử điều này trước đó ngày hôm nay và nó dường như không hoạt động. Tôi lấy ra một BigInteger sau khi một số chuyển đổi, sau đó cố gắng để làm điều này và nó đã cho tôi một chuỗi rác. –

+0

Không hoạt động !!! –

+0

Điều này không hoạt động! – user3000430

6

Sử dụng m.toString() hoặc String.valueOf(m). String.valueOf sử dụng toString() nhưng không an toàn.

+0

tôi đã thử cả hai. Nếu tin nhắn của tôi là hello sau đó trong cả hai cách tôi nhận được giá trị BigInteger của họ 448378203247. Nhưng tôi muốn xin chào lại không số nguyên – condinya

+1

Nếu BigInteger không đại diện cho một chuỗi thì dường như không có giá trị nào trong chuyển đổi nó thành một byte [] hoặc BigInteger. Tại sao bạn cần phải làm điều đó? – krock

8

Tại sao bạn không sử dụng công cụ xây dựng BigInteger(String)? Bằng cách đó, round-tripping qua toString() sẽ hoạt động tốt.

(Cũng lưu ý rằng chuyển đổi của bạn để byte không rõ ràng chỉ định một ký tự mã hóa và là nền tảng phụ thuộc - đó có thể là nguồn gốc của đau buồn hơn nữa xuống dòng)

+1

nếu i m sử dụng như BigInteger (String) constructor i m nhận ngoại lệ: java.lang.NumberFormatException – condinya

1

Để đảo ngược

byte[] bytemsg=msg.getBytes(); 

bạn có thể sử dụng

String text = new String(bytemsg); 

sử dụng một BigInteger chỉ làm phức tạp mọi thứ, trên thực tế nó không rõ ràng lý do tại sao bạn muốn có một byte []. Lập kế hoạch để làm gì với BigInteger hoặc byte []? Điểm là gì?

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

Khi xây dựng một BigInteger bằng một chuỗi, chuỗi phải được định dạng dưới dạng số thập phân. Bạn không thể sử dụng các chữ cái, trừ khi bạn chỉ định một cơ số trong đối số thứ hai, bạn có thể chỉ định tối đa 36 trong cơ số. 36 sẽ chỉ cung cấp cho bạn các ký tự chữ và số [0-9, a-z], vì vậy nếu bạn sử dụng, bạn sẽ không có định dạng. Bạn có thể tạo: BigInteger mới ("ihavenospaces", 36 tuổi) Sau đó, để chuyển đổi trở lại, sử dụng một ToString (36)

nhưng để giữ ĐỊNH DẠNG: Sử dụng byte [] phương pháp mà một vài người nhắc đến.Điều đó sẽ đóng gói dữ liệu có định dạng thành kích thước nhỏ nhất và cho phép bạn theo dõi số byte dễ dàng

Điều đó phải hoàn hảo cho chương trình ví dụ về hệ thống mật mã khóa công khai RSA, giả sử bạn giữ số byte trong thông điệp nhỏ hơn so với số lượng byte của PQ

(tôi nhận ra chủ đề này là cũ)

+0

Ý tưởng thú vị! –

5

bạn cũng có thể sử dụng chuyển đổi tiềm ẩn của Java:

BigInteger m = new BigInteger(bytemsg); 
String mStr = "" + m; // mStr now contains string representation of m. 
Các vấn đề liên quan