Вопрос

При написании игры для J2ME мы столкнулись с проблемой при использовании java.lang.Integer.parseInt().

У нас есть несколько постоянных значений, определенных как шестнадцатеричные значения, например:

CHARACTER_RED = 0xFFAAA005;

Во время игры значение сериализуется и принимается через сетевое соединение в виде строкового представления шестнадцатеричного значения.Чтобы проанализировать его обратно в int, мы безуспешно попробовали следующее:

// Response contains the value "ffAAA005" for "characterId"
string hexValue = response.get("characterId");
// The following throws a NumberFormatException
int value = Integer.parseInt(hexValue, 16);

Затем я провел несколько тестов и попробовал это:

string hexValue = Integer.toHexString(0xFFAAA005);
// The following throws a NumberFormatException
int value = Integer.parseInt(hexValue, 16);

Это исключение из реального кода:

java.lang.NumberFormatException: ffaaa005
    at java.lang.Integer.parseInt(Integer.java:462)
    at net.triadgames.acertijo.GameMIDlet.startMIDlet(GameMIDlet.java:109)

Это, признаться, меня сбило с толку.Глядя на код parseInt, кажется, что NumberFormatException генерируется, когда анализируемое число «пересекает» «отрицательную/положительную границу» (возможно, кто-то может отредактировать это на правильном жаргоне?).

Это ожидаемое поведение функции Integer.parseInt?В конце концов мне пришлось написать свою собственную функцию анализа шестнадцатеричной строки, и я был весьма недоволен предоставленной реализацией.

Другими словами, было ли мое ожидание того, что Integer.parseInt() будет работать с представлением целого числа в виде шестнадцатеричной строки, было ошибочным?

РЕДАКТИРОВАТЬ:В своем первоначальном сообщении я написал 0xFFFAAA005 вместо 0xFFAAA005.С тех пор я исправил эту ошибку.

Это было полезно?

Решение

А String который вы анализируете, слишком велик, чтобы поместиться в int.На Яве int — это знаковый 32-битный тип данных.Ваша строка требует не менее 36 бит.


Ваше (положительное) значение все еще слишком велико, чтобы вписаться в подписано 32-битный int.

Другие советы

Помните, что ваш ввод (4289372165) превышает максимальный размер int (2147483647)?

Попробуйте проанализировать значение как long и обрезать ведущие "0x" отключить строку перед ее анализом:

public class Program {
    public static void main(String[] args) {
        String input = "0xFFFAAA005";
        long value = Long.parseLong(input.substring(2), 16);
        System.out.print(value);
    }
}

Я не разработчик Java, но предполагаю, что parseInt работает только с целыми числами.0xFFFAAA005 имеет 9 шестнадцатеричных цифр, поэтому это длинное, а не целое число.Я предполагаю, что он жалуется, потому что вы попросили его проанализировать число, которое больше, чем тип данных результата.

Ваше число кажется слишком большим, чтобы поместиться в целое число, попробуйте вместо этого использовать Long.parseLong().Кроме того, строка, похоже, не анализируется, если в ней есть 0x, поэтому попробуйте отрезать ее.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top