2012-06-25 51 views
78

Tôi đang cố gắng chuyển đổi một chuỗi dài 8 ký tự mã thành một số nguyên để tôi có thể so sánh chuỗi thay vì so sánh chuỗi trên nhiều giá trị khác nhau.Chuyển đổi chuỗi thập lục phân thành int

Tôi biết điều này là khá tầm thường trong C++ nhưng tôi cần phải làm điều đó trong Java. Các trường hợp thử nghiệm tôi cần phải đáp ứng về cơ bản là để chuyển đổi "AA0F245C" để int và sau đó trở lại chuỗi đó để tôi biết nó đang chuyển đổi đúng.

Tôi đã thử những điều sau đây:

int decode = Integer.decode("0xAA0F245C"); // NumberFormatException 
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException 
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException 
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException 

Tôi cũng đã cố gắng làm việc đó hai nhân vật tại một thời điểm và nhân kết quả, mà các tác phẩm chuyển đổi nhưng số lượng là không đúng.

int id = 0; 
for (int h = 0; h < hex.length(); h= h+2) 
{ 
    String sub = hex.subSequence(h, h+2).toString(); 

if (id == 0) 
    id = Integer.valueOf(sub, 16); 
else 
    id *= Integer.valueOf(sub, 16);    
} 
//ID = 8445600 which = 80DEA0 if I convert it back. 

Tôi không thể sử dụng thư viện của bên thứ ba để bạn biết, vì vậy việc này phải được thực hiện trong thư viện chuẩn Java.

Cảm ơn sự giúp đỡ của bạn trước.

+0

Bạn đang nhân khi bạn cần phải thay đổi. –

+7

'0xAA0F245C = 2853119068' nhưng' Integer.MAX_VALUE = 0x7fffffff = 2147483647' – Pshemo

+4

Tôi biết câu hỏi đã xảy ra trong hai năm. Tuy nhiên, java 8 cho phép một giải pháp khác. Họ đã thêm phương thức 'Integer.parseUnsignedInt (" value ", radix)' phục vụ cho mục đích của bạn. Nếu giá trị lớn hơn 'Integer.MAX_VALUE', nó được ánh xạ tới một số âm. – John

Trả lời

115

Chỉ đơn giản là quá lớn đối với một int (là 4 byte và được ký).

Sử dụng

Long.parseLong("AA0F245C", 16); 
+3

Tuyệt vời cảm ơn bạn! Có lẽ tôi nên biết điều đó. Nhưng nó làm cho tôi cảm thấy tốt hơn không ai trong số 4 người tôi hỏi trước khi gửi bài biết nó hoặc là :). Là một lưu ý phụ, bây giờ tôi phải tìm ra lý do tại sao người viết mã mà tôi cần phải so sánh các int để có chúng như ints và không lâu ... mà có lẽ có nghĩa là cái gì khác là tắt. Đó là ngoài điểm ... cảm ơn bạn vì câu trả lời nhanh !!!! Ngoài ra nguyền rủa bạn java cho thông báo lỗi khủng khiếp của bạn ... "Nó to lớn" sẽ có ích. – Roloc

+1

'' Nó to lớn "sẽ hữu ích. ' Java không phải là một người phụ nữ ... –

13

Giá trị tối đa mà một Java Integer có thể xử lý là 2147483657, hoặc 2^31-1. Số thập lục phân AA0F245C là số 2853119068 dưới dạng số thập phân và quá lớn nên bạn cần sử dụng

Long.parseLong("AA0F245C", 16); 

để làm cho nó hoạt động.

+0

off: thú vị rằng một câu trả lời chi tiết hơn mặc dù 5 phút sau đó chỉ có 1 upvote so với 14. Mặc dù đúng, điều này đã không nói huyền diệu '4 byte' và 'ký' ... hm – n611x007

6

bạn có thể dễ dàng thực hiện việc này với parseInt với thông số định dạng.

Integer.parseInt("-FF", 16) ; // returns -255 

javadoc Integer

+4

Bạn đã thử với chuỗi đầy đủ mà tôi đã đăng chưa? – Roloc

15

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

System.out.println(Integer.decode("0x4d2")) // output 1234 
//and vice versa 
System.out.println(Integer.toHexString(1234); // output is 4d2); 
+0

tôi thích câu trả lời này, không biết có một phương pháp chung, typeinsensitive cho điều này trong lớp Integer. cảm ơn vì kiến ​​thức. – Gewure

1

Đây là câu trả lời đúng:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)

Các vấn đề liên quan