Integer.parseInt(string, radix) в Java возвращает (в основном) отрицательные десятичные значения

Как я уже сказал выше, я использую Integer.parseInt для преобразования шестнадцатеричных значений в десятичные, но я продолжаю получать отрицательные целые числа, когда ввожу положительные шестнадцатеричные значения:

byte[] bytes2 = getMacBytes("90:e6:ba:97:4a:bb");

private static byte[] getMacBytes(String macStr) throws IllegalArgumentException {
    byte[] bytes = new byte[6];
    String[] hex = macStr.split("(\\:|\\-)");
    for (int i = 0; i < 6; i++){
        System.out.println(hex[i]);
    }
    if (hex.length != 6) {
        throw new IllegalArgumentException("Invalid MAC address.");
    }
    try {
        for (int i = 0; i < 6; i++) {
            bytes[i] = (byte) Integer.parseInt(hex[i], 16);
            System.out.println(bytes[i]);
        }
    }
    catch (NumberFormatException e) {
        throw new IllegalArgumentException("Invalid hex digit in MAC address.");
    }
    return bytes;
}

когда я запускаю этот код, он возвращает это:

90 e6 ba 97 4a bb -112 -26 -70 -105 74 -69

Итак, я вижу, что MAC-адрес правильно разделен, но 5 из 6 шестнадцатеричных значений возвращаются из Integer.parseInt(string, radix) как отрицательные. Я вижу, что отрицательные значения - это x + 256 их фактического десятичного значения, но второе последнее является правильным десятичным значением... Есть идеи, почему он превращает 5 из 6 значений в отрицательные?


person lachs    schedule 05.03.2013    source источник
comment
Вы пытались добавить 0x перед вашими hex[i] String, чтобы Java интерпретировала его как шестнадцатеричный?   -  person Y__    schedule 05.03.2013
comment
@Y__: Вот для чего нужна система счисления.   -  person T.J. Crowder    schedule 05.03.2013
comment
Эх жаль не видел :(   -  person Y__    schedule 05.03.2013


Ответы (1)


Я думаю, что parseInt ведет себя правильно, но ваше приведение к байту преобразует числа в диапазон [-128; 127]. Попробуйте сохранить результаты в массиве short или int или сохранить их в массиве байтов, но не забудьте распечатать их с помощью System.out.println(bytes[i] & 0xff).

person marcus    schedule 05.03.2013
comment
@ lachs: Помните, что byte в Java — это знаковое число в диапазоне от -128 до 127. Таким образом, (byte)200 равно -56. - person T.J. Crowder; 05.03.2013
comment
Большое спасибо, Маркус и все остальные! Я знал, что это должно быть что-то простое, но не настолько простое. Я чувствую себя майором n00b. Удачной ночи/дня, где бы вы ни были, и еще раз спасибо! - person lachs; 05.03.2013