Чтобы проверить, находится ли шестнадцатеричная строка в заданном диапазоне [duplicate]

Я использую это:

gridItems = this.state.applications.map(app =>
                            <ApplicationItem key={app.Id} app={app } />
                            );

PD: никогда не забывайте ключ или у вас будет много предупреждений!

54
задан Sumit Singh 17 August 2012 в 13:18
поделиться

7 ответов

Он переполняется, потому что число отрицательно.

Попробуйте это, и он будет работать:

int n = (int) Long.parseLong("ffff8000", 16);
36
ответ дан Baz 26 August 2018 в 08:15
поделиться

Метод parseInt Java в действительности представляет собой кучу кода, в котором есть «false» hex: если вы хотите перевести -32768, вы должны преобразовать абсолютное значение в hex, а затем добавить строку с помощью «-».

Существует образец файла Integer.java:

public static int parseInt(String s, int radix)

Описание довольно явное:

* Parses the string argument as a signed integer in the radix 
* specified by the second argument. The characters in the string 
...
...
* parseInt("0", 10) returns 0
* parseInt("473", 10) returns 473
* parseInt("-0", 10) returns 0
* parseInt("-FF", 16) returns -255
3
ответ дан Benj 26 August 2018 в 08:15
поделиться

Использование Integer.toHexString(...) - хороший ответ. Но лично предпочитаем использовать String.format(...).

Попробуйте этот образец в качестве теста.

byte[] values = new byte[64];
Arrays.fill(values, (byte)8);  //Fills array with 8 just for test
String valuesStr = "";
for(int i = 0; i < values.length; i++)
    valuesStr += String.format("0x%02x", values[i] & 0xff) + " ";
valuesStr.trim();
1
ответ дан Chef Pharaoh 26 August 2018 в 08:15
поделиться

Поскольку Integer.toHexString (byte / integer) не работает, когда вы пытаетесь преобразовать подписанные байты, такие как декодированные символы UTF-16, которые вы должны использовать:

Integer.toString(byte/integer, 16);

или

String.format("%02X", byte/integer);

reverse вы можете использовать

Integer.parseInt(hexString, 16);
3
ответ дан Code.IT 26 August 2018 в 08:15
поделиться

Хехе, любопытно. Я думаю, что это «намеренная ошибка», так сказать.

Основная причина заключается в том, как записывается класс Integer. В принципе, parseInt «оптимизирован» для положительных чисел. Когда он анализирует строку, он создает результат кумулятивно, но отрицается. Затем он переворачивает знак конечного результата.

Пример:

66 = 0x42

разобран как:

4*(-1) = -4
-4 * 16 = -64 (hex 4 parsed)

-64 - 2 = -66 (hex 2 parsed)

return -66 * (-1) = 66

Теперь рассмотрим ваш пример FFFF8000

16*(-1) = -16 (first F parsed)
-16*16 = -256 

-256 - 16 = -272 (second F parsed)
-272 * 16 = -4352 

-4352 - 16 = -4368 (third F parsed)
-4352 * 16 = -69888

-69888 - 16 = -69904 (forth F parsed)
-69904 * 16 = -1118464 

-1118464 - 8 = -1118472 (8 parsed)
-1118464 * 16 = -17895552 

-17895552 - 0 = -17895552 (first 0 parsed)
Here it blows up since -17895552 < -Integer.MAX_VALUE / 16 (-134217728). 
Attempting to execute the next logical step in the chain (-17895552 * 16)
would cause an integer overflow error.

Редактирование (добавление): для того, чтобы parseInt () работал «последовательно» для -Integer.MAX_VALUE & lt; = n & lt; = Integer.MAX_VALUE , им пришлось бы реализовать логику для «поворота» при достижении -Integer.MAX_VALUE в кумулятивном результате, начиная с максимального конца целочисленного диапазона и продолжая вниз оттуда. Почему они этого не сделали, нужно было бы спросить Джоша Блоха или того, кто его осуществил в первую очередь. Это может быть просто оптимизация.

Однако,

Hex=Integer.toHexString(Integer.MAX_VALUE);
System.out.println(Hex);
System.out.println(Integer.parseInt(Hex.toUpperCase(), 16));

работает просто отлично, по этой причине. В источнике для Integer вы можете найти этот комментарий.

// Accumulating negatively avoids surprises near MAX_VALUE
1
ответ дан pap 26 August 2018 в 08:15
поделиться

Попробуйте использовать класс BigInteger, он работает.

int Val=-32768;
String Hex=Integer.toHexString(Val);

//int FirstAttempt=Integer.parseInt(Hex,16); // Error "Invalid Int"
//int SecondAttempt=Integer.decode("0x"+Hex);  // Error "Invalid Int"
BigInteger i = new BigInteger(Hex,16);
System.out.println(i.intValue());
53
ответ дан soon 26 August 2018 в 08:15
поделиться

Стоит отметить, что Java 8 имеет методы Integer.parseUnsignedInt и Long.parseUnsignedLong, которые делают то, что вы хотели, в частности:

Integer.parseUnsignedInt("ffff8000",16) == -32768

Имя немного запутывает , поскольку он анализирует целое число со знаком из шестнадцатеричной строки, но выполняет эту работу.

7
ответ дан Yuval Sapir 26 August 2018 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: