2013-02-18 3 views
0

Я пытаюсь проанализировать следующие строки для байтов. Но это дает мне NumberFormat Exception. Может ли кто-то сказать мне, что является решением для этого?NumberFormat Исключение для разбора строки в байт?

Byte.parseByte("11111111111111111111111110000001", 2); 
+2

То путь больше чем байт. – Perception

+0

Байт состоит из 8 бит ... каждый из ваших символов 0/1 немного. – pcalcao

+0

DV - проверьте javadocs перед отправкой вопроса. – djechlin

ответ

2

Вне диапазона байта, т.е. -128 до 127. Из parseByte(String s,int radix) Javadoc:

public static byte parseByte(String s, int radix)throws NumberFormatException 

Анализирует строковый аргумент в качестве знакового байта в системе счисления, указанный второй аргумент. Символы в строке должны быть цифрами, указанного значения (как определено ли символ.digit (char, int) возвращает неотрицательное значение), за исключением того, что первый символ может быть знаком ASCII минус '-' ('\ u002D'), чтобы указать отрицательное значение. Возвращаемое значение байта возвращается. Исключение типа NumberFormatException генерируется, если любой из следующих ситуаций происходит :

  1. Первый аргумент является нулевым или является строкой нулевой длины.
  2. Радиус либо меньше, чем Character.MIN_RADIX или больше, чем Character.MAX_RADIX.
  3. Любой символ строки не является цифрой указанного радикса, за исключением того, что первый символ может быть знаком минус «-» («\ u002D») при условии, что строка длиннее, чем длина 1.
  4. Значение, представленное строкой, не является значением байта типа.

Возвращает: значение байта, представленное строковым аргументом в указанной системе счисления Броски: NumberFormatException - Если строка не содержит оформленной байт.

+1

Это неверно. 'parseXXX()' методы обрабатывают двоичную строку как величину знака не как дополнение 2. См. Мой ответ. –

+1

@ Eng.Fouad: Ответ здесь правильный, на самом деле это просто копирование/вставка из javadoc без ссылки на него. – jlordo

+1

@jlordo Я знаю, и именно поэтому я не проголосовал за этот ответ. Но они сказали: «Парсирует строковый аргумент в качестве подписанного байта», который ИМХО не совсем прав, если radix = 2. –

1

от Javadocs

Исключение типа NumberFormatException генерируется, если какой-либо из следующих ситуаций:

  • Первый аргумент является нулевым или является строкой нулевой длины.
  • Радиус либо меньше, чем Character.MIN_RADIX или больше, чем Character.MAX_RADIX.
  • Любой символ строки не является цифрой указанного счисления, за исключением того, что первый символ может быть знаком минус «-» («\ u002D») при условии, что строка длиннее, чем длина 1.
  • Значение, представленное строкой, не является значением байта типа.

Ваше значение является вторым случаем, который находится вне диапазона от -128 до 127

2

Byte.parseByte() обрабатывает бинарную строку в качестве знака-величины не в качестве дополнения 2'S, поэтому наибольшей длиной вы можете иметь для байт - 7 бит со знаком.

Другими словами, для представления -127, вы должны использовать:

Byte.parseByte("-111111", 2); 

Следующие броски NumberFormatException:

Byte.parseByte("10000000", 2); 

Однако двоичный литерал -127 является:

byte b = (byte) 0b10000000; 

Аналогичное поведение применяется к другому parseXXX() методов.

0

Значение слишком велико, чтобы быть разобраны в байт Попробуйте это:

new BigInteger("011111111111111111111111110000001", 2).longValue(); 
Смежные вопросы