Перетворити шістнадцятковий рядок в int


111

Я намагаюсь перетворити рядок, який має шістнадцятковий код із шістнадцятковим кодом, у ціле число, щоб я міг робити порівняння int замість порівняння рядків для багатьох різних значень.

Я знаю, що це досить тривіально в C ++, але мені потрібно це робити на Java. Тестовий випадок, який мені потрібно задовольнити, це по суті, щоб перетворити "AA0F245C" в int, а потім повернутися до цього рядка, щоб я знав, що він перетворює правильно.

Я спробував таке:

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

Я також намагався робити це два символи одночасно і множувати результати, що конверсія працює, але число не є правильним.

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. 

Я не можу використовувати бібліотеки сторонніх організацій лише для того, щоб ви знали, тому це потрібно робити в стандартних бібліотеках Java.

Заздалегідь дякую за допомогу


Ви множите, коли вам слід змінити.
Натан Моінвазірі

7
0xAA0F245C = 2853119068алеInteger.MAX_VALUE = 0x7fffffff = 2147483647
Пшемо

5
Я знаю, що питання існує вже два роки. Однак java 8 дозволяє інше рішення. Вони додали Integer.parseUnsignedInt("value",radix)метод, який відповідає вашим цілям. Якщо значення більше, ніж Integer.MAX_VALUEвоно відображається на від’ємне число.
Джон

Відповіді:


151

Він просто занадто великий для int (який становить 4 байти і підписаний).

Використовуйте

Long.parseLong("AA0F245C", 16);

4
Дивовижне дякую! Я, мабуть, мав це знати. Але я відчуваю себе краще, ніхто з 4 людей, яких я запитував перед публікацією, це не знав :). Як зауваження, я зараз повинен зрозуміти, чому людина написав код, який мені потрібно порівняти, щоб мати їх як ints, а не longs ... що, ймовірно, означає, що щось інше вимкнено. Окрім суті ... дякую за швидку відповідь !!!! Також проклинайте вас Java за ваше жахливе повідомлення про помилку ... "Це на велике" було б корисно.
Roloc

Коли я намагаюся з великою шістнадцятковою струною, я отримую NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... Рішення?
Анум Шераз

@AnumSheraz ви не хочете конвертувати у довгий, а в байтовий масив. Дивіться, наприклад , stackoverflow.com/questions/140131 / ...
DENYS Séguret

Альтернативою перетворенню в байтовий масив для великої кількості є використання такого BigIntegerкласу:BigInteger value = new BigInteger(valueString, 16)
Javaru

33

ви можете використовувати так

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

1
мені подобається ця відповідь, я не знав, що існує загальний, типочутливий метод для цього в класі Integer. дякую за знання.
Gewure

18

Максимальне значення, яке Integerможе обробити Java, - 2147483657 або 2 ^ 31-1. Шістнадцяткове число AA0F245C становить 2853119068 як десяткове число, і воно занадто велике, тому вам потрібно використовувати

Long.parseLong("AA0F245C", 16);

щоб змусити його працювати.


off: Цікаво, що більш детальна відповідь, хоча через 5 хвилин, отримує лише 1 підсумок порівняно з 14. Хоча це правда, цей не сказав магічні "4 байти" та "підписали" ... хм.
n611x007

9

Ви можете легко зробити це за допомогою parseInt з параметром формату.

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

javadoc Integer


посилання розірвано
odinthenerd


3

Для тих із вас, кому потрібно перетворити шістнадцяткове представлення підписаного байту з двосимвольної String в байт (який у Java завжди підписаний), є приклад. Розбір шістнадцяткової строки ніколи не дає від'ємне число, що є несправним, оскільки 0xFF дорівнює -1 з деякої точки зору (кодування двох доповнення). Принцип полягає в тому, щоб проаналізувати вхідний рядок як int, який більший за байт, а потім обернути навколо негативних чисел. Я показую лише байти, тому цей приклад є досить коротким.

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

Це можна відредагувати для обробки довших чисел. Просто додайте більше FF або 00 відповідно. Для розбору 8 цілих чисел, підписаних шістнадцятковим символом, потрібно використовувати Long.parseLong, оскільки FFFF-FFFF, який є цілим числом -1, не впишеться в Integer, якщо представлений як додатне число (дає 4294967295). Тож вам потрібно Довго зберігати його. Після перетворення на від’ємне число та повернення до Integer воно підходить. Не існує шістнадцяткової шістнадцяткової рядки, яка б не підходила до цілого числа.


1

Додатковим варіантом до запропонованих є використання BigIntegerкласу. Оскільки шістнадцяткові значення часто є великими числами, такими як значення sha256 або sha512, вони легко переповнюють значення inta і a long. Хоча перетворення в байтовий масив є варіантом, як показують інші відповіді BigInterger, але часто забутий клас в java також є варіантом.

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

Спробуйте з цим:

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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.