Chuyển đổi chuỗi hex thành int


111

Tôi đang cố gắng chuyển đổi một chuỗi dài 8 ký tự của mã hex thành một số nguyên để tôi có thể thực hiện so sánh int thay vì so sánh chuỗi trên nhiều giá trị khác nhau.

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

Tôi đã thử những cách sau:

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 đã thử thực hiện hai ký tự cùng một lúc và nhân kết quả, chuyển đổi hoạt động nhưng con số 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, vì vậy điều này phải được thực hiện trong các thư viện chuẩn Java.

Trước tiên xin cảm ơn sự giúp đỡ của bạn.


Bạn đang nhân lên khi bạn nên thay đổi.
Nathan Moinvaziri

7
0xAA0F245C = 2853119068nhưngInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

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

Câu trả lời:


151

Nó chỉ đơn giản là quá lớn đối với một int (là 4 byte và có dấu).

Sử dụng

Long.parseLong("AA0F245C", 16);

4
Tuyệt vời cảm ơn bạn! Tôi có lẽ nên biết điều đó. Nhưng nó khiến 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 đăng bài cũng biết điều đó :). Lưu ý thêm, 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 so sánh các int để chúng là int chứ không phải longs ... điều này có thể có nghĩa là một cái gì đó khác đã tắt. Đó là ngoài điểm ... cảm ơn bạn đã trả lời nhanh chóng !!!! Cũng nguyền rủa bạn java vì thông báo lỗi khủng khiếp của bạn ... "Nó to lớn" sẽ có ích.
Roloc

Khi tôi thử với chuỗi hex lớn, tôi nhận được NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... Giải pháp?
Anum Sheraz

@AnumSheraz bạn không muốn chuyển đổi thành một mảng dài mà thành một mảng byte. Xem ví dụ stackoverflow.com/questions/140131/…
Denys Séguret,

Một thay thế cho chuyển đổi sang một mảng byte cho một số lượng lớn là sử dụng BigIntegerlớp như thế này:BigInteger value = new BigInteger(valueString, 16)
Javaru

33

bạn có thể sử dụng như vậy

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

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

18

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

Long.parseLong("AA0F245C", 16);

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


tắt: thú vị là một câu trả lời chi tiết hơn mặc dù 5 phút sau chỉ nhận được 1 lượt ủng hộ so với 14. Mặc dù đúng, câu này không nói "4 byte" và "ký tên" kỳ diệu ... hm.
n611x007


5

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

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


3

Đối với những người bạn cần chuyển đổi biểu diễn thập lục phân của một byte có dấu từ Chuỗi hai ký tự thành byte (trong Java luôn được ký), có một ví dụ. Phân tích cú pháp một chuỗi thập lục phân không bao giờ cho số âm, điều này bị lỗi, vì 0xFF là -1 theo một số quan điểm (mã hóa bổ sung của hai). Nguyên tắc là phân tích cú pháp chuỗi đến là int, lớn hơn byte, sau đó quấn quanh các số âm. Tôi chỉ hiển thị byte, vì vậy ví dụ đó đủ ngắn.

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

Điều này có thể được chỉnh sửa để xử lý các số dài hơn. Chỉ cần thêm nhiều FF hoặc 00 tương ứng. Để phân tích cú pháp 8 số nguyên có dấu hex, bạn cần sử dụng Long.parseLong, vì FFFF-FFFF, là số nguyên -1, sẽ không vừa với Số nguyên khi được biểu diễn dưới dạng số dương (cho 4294967295). Vì vậy, bạn cần Long để lưu trữ nó. Sau khi chuyển đổi thành số âm và truyền trở lại Số nguyên, nó sẽ phù hợp. Không có chuỗi hex 8 ký tự, cuối cùng sẽ không khớp với số nguyên.


1

Một tùy chọn bổ sung cho những tùy chọn được đề xuất, là sử dụng BigIntegerlớp học. Vì giá trị hex thường là số lớn, chẳng hạn như giá trị sha256 hoặc sha512, chúng sẽ dễ dàng làm tràn an intvà a long. Trong khi chuyển đổi thành mảng byte là một tùy chọn như các câu trả lời khác hiển thị, BigIntergerthì lớp thường bị lãng quên trong java cũng là một tùy chọn.

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266

0
//Method for Smaller Number Range:
Integer.parseInt("abc",16);

//Method for Bigger Number Range.
Long.parseLong("abc",16);

//Method for Biggest Number Range.
new BigInteger("abc",16);

0

Hãy thử với cái này:

long abc = convertString2Hex ("1A2A3B");

private  long  convertString2Hex(String numberHexString)
{
    char[] ChaArray = numberHexString.toCharArray();
    long HexSum=0;
    long cChar =0;

    for(int i=0;i<numberHexString.length();i++ )
    {
        if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
            cChar = ChaArray[i] - '0';
        else
            cChar = ChaArray[i]-'A'+10;
        HexSum = 16 * HexSum + cChar;
    }
    return  HexSum;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.