Ubah string hex menjadi int

111

Saya mencoba untuk mengubah string yang terdiri dari 8 karakter kode hex menjadi integer sehingga saya dapat melakukan perbandingan int daripada perbandingan string pada banyak nilai yang berbeda.

Saya tahu ini cukup sepele di C ++ tetapi saya harus melakukannya di Java. Kasus uji yang perlu saya penuhi pada dasarnya adalah untuk Mengkonversi "AA0F245C" menjadi int dan kemudian kembali ke string itu sehingga saya tahu itu benar.

Saya telah mencoba yang berikut ini:

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

Saya juga mencoba melakukannya dua karakter sekaligus dan mengalikan hasilnya, yang konversinya berfungsi tetapi jumlahnya tidak tepat.

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. 

Saya tidak bisa menggunakan perpustakaan pihak ketiga asal tahu saja, jadi ini harus dilakukan di perpustakaan standar Java.

Terima kasih atas bantuan Anda sebelumnya.

Roloc
sumber
Anda mengalikan saat Anda harus melakukan perpindahan gigi.
Nathan Moinvaziri
7
0xAA0F245C = 2853119068tapiInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo
5
Saya tahu pertanyaan itu sudah ada selama dua tahun. Namun, java 8 memungkinkan solusi lain. Mereka menambahkan Integer.parseUnsignedInt("value",radix)metode yang sesuai dengan tujuan Anda. Jika nilainya lebih besar dari Integer.MAX_VALUEitu dipetakan ke angka negatif.
Yohanes

Jawaban:

151

Ini terlalu besar untuk int (yang berukuran 4 byte dan ditandatangani).

Menggunakan

Long.parseLong("AA0F245C", 16);
Denys Séguret
sumber
4
Luarbiasa, terimakasih! Saya mungkin seharusnya tahu itu. Tapi itu membuat saya merasa lebih baik tidak satupun dari 4 orang yang saya tanya sebelum posting mengetahuinya juga :). Sebagai catatan tambahan, sekarang saya harus mencari tahu mengapa orang tersebut menulis kode yang saya perlukan untuk membandingkan int agar memilikinya sebagai int dan bukan rindu ... yang mungkin berarti ada sesuatu yang tidak aktif. Selain itu intinya ... terima kasih atas jawaban cepatnya !!!! Juga mengutuk Anda java untuk pesan kesalahan Anda yang mengerikan ... "Ini terlalu besar" akan sangat membantu.
Roloc
Ketika saya mencoba dengan string hex besar, saya mendapatkan NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... Solusi?
Anum Sheraz
@AnumSheraz Anda tidak ingin mengonversi ke array panjang tetapi menjadi byte. Lihat misalnya stackoverflow.com/questions/140131/…
Denys Séguret
Alternatif untuk mengonversi ke array byte untuk sejumlah besar adalah dengan menggunakan BigIntegerkelas seperti ini:BigInteger value = new BigInteger(valueString, 16)
Javaru
33

Anda dapat menggunakan seperti itu

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);
cebol gautam
sumber
1
Saya suka jawaban ini, tidak tahu ada metode generik dan sensitif jenis untuk ini di kelas Integer. terima kasih atas ilmunya.
Gewure
18

Nilai maksimum yang Integerbisa ditangani Java adalah 2147483657, atau 2 ^ 31-1. Angka heksadesimal AA0F245C adalah 2853119068 sebagai angka desimal, dan terlalu besar, jadi Anda perlu menggunakan

Long.parseLong("AA0F245C", 16);

untuk membuatnya berhasil.

Tidak lengkap
sumber
off: menarik bahwa jawaban yang lebih mendetail meskipun 5 menit kemudian hanya mendapat 1 suara positif dibandingkan dengan 14. Meskipun benar, yang ini tidak mengatakan ajaib '4 byte' dan 'ditandatangani' ... hm.
n611x007
9

Anda dapat dengan mudah melakukannya dengan parseInt dengan parameter format.

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

javadoc Integer

panas
sumber
tautannya rusak
odinthenerd
5

Ini adalah jawaban yang benar:

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

HannahCarney
sumber
3

Bagi Anda yang perlu mengubah representasi heksadesimal dari byte yang ditandatangani dari String dua karakter menjadi byte (yang di Java selalu ditandatangani), ada contohnya. Parsing string heksadesimal tidak pernah memberikan angka negatif, yang salah, karena 0xFF adalah -1 dari beberapa sudut pandang (pengkodean pelengkap dua). Prinsipnya adalah mengurai String yang masuk sebagai int, yang lebih besar dari byte, dan kemudian membungkus angka negatif. Saya hanya menampilkan byte, jadi contoh itu cukup singkat.

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

Ini dapat diedit untuk memproses nomor yang lebih panjang. Cukup tambahkan lebih banyak FF atau 00 masing-masing. Untuk mengurai 8 bilangan bulat bertanda heksadesimal, Anda perlu menggunakan Long.parseLong, karena FFFF-FFFF, yang merupakan bilangan bulat -1, tidak akan cocok dengan Bilangan bulat ketika direpresentasikan sebagai angka positif (memberikan 4294967295). Jadi Anda membutuhkan Long untuk menyimpannya. Setelah dikonversi ke angka negatif dan dikembalikan ke Integer, itu akan cocok. Tidak ada string hex 8 karakter, yang pada akhirnya tidak akan cocok dengan integer.

JanSmrz
sumber
1

Opsi tambahan untuk yang disarankan, adalah menggunakan BigIntegerkelas. Karena nilai hex seringkali berupa angka besar, seperti nilai sha256 atau sha512, mereka akan dengan mudah meluap intdan a long. Saat mengonversi ke array byte adalah opsi seperti yang ditunjukkan jawaban lain BigInterger, kelas yang sering dilupakan di java, adalah opsi juga.

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266
Javaru
sumber
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);
Nitish Kumar
sumber
0

Coba dengan ini:

panjang 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;
}
Josko Marsic
sumber