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.
0xAA0F245C = 2853119068
tapiInteger.MAX_VALUE = 0x7fffffff = 2147483647
Integer.parseUnsignedInt("value",radix)
metode yang sesuai dengan tujuan Anda. Jika nilainya lebih besar dariInteger.MAX_VALUE
itu dipetakan ke angka negatif.Jawaban:
Ini terlalu besar untuk int (yang berukuran 4 byte dan ditandatangani).
Menggunakan
sumber
NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"
... Solusi?BigInteger
kelas seperti ini:BigInteger value = new BigInteger(valueString, 16)
Anda dapat menggunakan seperti itu
sumber
Nilai maksimum yang
Integer
bisa ditangani Java adalah 2147483657, atau 2 ^ 31-1. Angka heksadesimal AA0F245C adalah 2853119068 sebagai angka desimal, dan terlalu besar, jadi Anda perlu menggunakanuntuk membuatnya berhasil.
sumber
Anda dapat dengan mudah melakukannya dengan parseInt dengan parameter format.
javadoc Integer
sumber
Ini adalah jawaban yang benar:
myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)
sumber
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.
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.
sumber
Opsi tambahan untuk yang disarankan, adalah menggunakan
BigInteger
kelas. Karena nilai hex seringkali berupa angka besar, seperti nilai sha256 atau sha512, mereka akan dengan mudah meluapint
dan along
. Saat mengonversi ke array byte adalah opsi seperti yang ditunjukkan jawaban lainBigInterger
, kelas yang sering dilupakan di java, adalah opsi juga.sumber
sumber
Coba dengan ini:
panjang abc = convertString2Hex ("1A2A3B");
sumber