Onaltılık dizeyi int'e dönüştür


111

8 karakter uzunluğunda onaltılık kod olan bir dizeyi tam sayıya dönüştürmeye çalışıyorum, böylece çok sayıda farklı değer üzerinden dize karşılaştırmaları yerine int karşılaştırması yapabilirim.

Bunun C ++ 'da oldukça önemsiz olduğunu biliyorum ama bunu Java ile yapmam gerekiyor. Karşılamam gereken test durumu, esasen "AA0F245C" yi int'e dönüştürmek ve sonra o dizgeye geri dönerek doğru dönüştürüldüğünü bilmemdir.

Aşağıdakileri denedim:

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

Ayrıca, bir seferde iki karakter yapmayı ve sonuçları çarpmayı denedim, bu dönüşüm işe yarıyor, ancak sayı doğru değil.

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. 

Üçüncü şahıs kitaplıklarını sadece bildiğiniz için kullanamam, bu yüzden bunun Java standart kitaplıklarında yapılması gerekir.

Yardımınız için şimdiden teşekkür ederim.


Değişmen gerektiği zaman çoğalıyorsun.
Nathan Moinvaziri

7
0xAA0F245C = 2853119068veInteger.MAX_VALUE = 0x7fffffff = 2147483647
Pshemo

5
Sorunun iki yıldır ortalıkta olduğunu biliyorum. Bununla birlikte, java 8 başka bir çözüm sağlar. Integer.parseUnsignedInt("value",radix)Amacınıza hizmet eden yöntemi eklediler . Değer bundan büyükse Integer.MAX_VALUE, negatif bir sayıya eşlenir.
John

Yanıtlar:


151

Bir int için çok büyük (4 bayt ve işaretli).

kullanım

Long.parseLong("AA0F245C", 16);

4
Harika. Teşekkürler! Muhtemelen bunu bilmeliydim. Ama bu beni daha iyi hissettiriyor, göndermeden önce sorduğum 4 kişiden hiçbiri bunu bilmiyordu :). Bir yan not olarak, şimdi ints'i uzun değil, tam olarak sahip olmak için karşılaştırmam gereken kodu kişinin neden yazdığını bulmalıyım ... Bu muhtemelen başka bir şeyin kapalı olduğu anlamına gelir. Önemli olanın yanı sıra ... hızlı cevap için teşekkürler !!!! Ayrıca korkunç hata mesajınız için java'ya lanet olsun ... "Çok büyük" yardımcı olabilirdi.
Roloc

Büyük onaltılık ip ile denediğimde, karşıma NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"...
Anum Sheraz

@AnumSheraz uzun bir bayt dizisine dönüştürmek istemiyorsunuz. Örneğin stackoverflow.com/questions/140131/…
Denys Séguret

Büyük bir sayı için bir bayt dizisine dönüştürmenin bir alternatifi, BigIntegersınıfı şu şekilde kullanmaktır :BigInteger value = new BigInteger(valueString, 16)
Javaru

33

böyle kullanabilirsin

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

1
Bu yanıtı beğendim, Integer sınıfında bunun için genel, tipe duyarlı bir yöntem olduğunu bilmiyordum. bilgi için teşekkürler.
Gewure

18

Bir Java'nın Integerişleyebileceği maksimum değer 2147483657 veya 2 ^ 31-1'dir. AA0F245C onaltılık sayı ondalık sayı olarak 2853119068'dir ve çok büyüktür, bu nedenle kullanmanız gerekir

Long.parseLong("AA0F245C", 16);

çalışmasını sağlamak için.


kapalı: 5 dakika sonra daha ayrıntılı bir cevabın 14'e kıyasla yalnızca 1 olumlu oy alması ilginç. Doğru olmasına rağmen, bu sihirli '4 bayt' ve 'imzalı' demedi ... hm.
n611x007


5

Bu doğru cevap:

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


3

İşaretli bir baytın onaltılık gösterimini iki karakterli String'den bayta (Java'da her zaman işaretlidir) dönüştürmesi gerekenler için bir örnek var. Onaltılık bir dizeyi ayrıştırmak hiçbir zaman negatif sayı vermez, bu da hatalı çünkü 0xFF bir bakış açısından -1'dir (ikinin tümleyen kodlaması). İlke, gelen String'i bayttan daha büyük olan int olarak ayrıştırmak ve ardından negatif sayıların etrafına sarmaktır. Sadece bayt gösteriyorum, bu yüzden bu örnek yeterince kısa.

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

Bu, daha uzun sayıları işlemek için düzenlenebilir. Sırasıyla daha fazla FF veya 00 ekleyin. 8 onaltılık işaretli tamsayıyı ayrıştırmak için Long.parseLong kullanmanız gerekir, çünkü -1 tamsayı olan FFFF-FFFF, pozitif bir sayı olarak temsil edildiğinde Tamsayıya sığmaz (4294967295 verir). Yani saklamak için Long'a ihtiyacınız var. Negatif sayıya dönüştürüldükten ve Tamsayıya geri çevrildikten sonra sığacaktır. Sonuna tamsayı sığmayan 8 karakterli onaltılık dizge yoktur.


1

Önerilenlere ek bir seçenek de BigIntegersınıfı kullanmaktır . Onaltılık değerler genellikle büyük sayılar olduğundan, sha256 veya sha512 değerleri gibi, kolayca an intve a'yı aşacaklardır long. Bir bayt dizisine dönüştürmek, diğer yanıtların gösterdiği gibi bir seçenek olsa da BigInterger, java'da sıklıkla unutulan sınıf da bir seçenektir.

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

Şununla dene:

uzun 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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.