Преобразование байта в кодировке US-ASCII в целое число и обратно - PullRequest
3 голосов
/ 07 августа 2011

У меня есть байтовый массив, который может иметь размер 2,3 или 4. Мне нужно преобразовать это в правильное целочисленное значение.Мне также нужно сделать это в обратном порядке, т. Е. Целое число в 2,3 или 4 символа в байтовом массиве.

Например, необработанные шестнадцатеричные байты: 54 и 49. Значение US-ASCII декодированной строки равно 61.Таким образом, целочисленный ответ должен быть 61.

Я прочитал все вопросы о преобразовании в stackoverflow и т. Д., Которые я мог найти, но они все дают совершенно неправильный ответ, я не знаю, может ли это быть кодировка?

Если я сделаю new String(lne,"US-ASCII"), где lne - мой байтовый массив, я получу правильный 61. Но при этом ((int)lne[0] << 8) | ((int)lne[1] & 0xFF) я получу полный неправильный ответ.

Это можетбыть глупой ошибкой, или я полностью не понимаю схемы представления чисел в Java и идею кодирования / декодирования.

Любая помощь будет принята.

ПРИМЕЧАНИЕ: Я знаю, что могу просто разобратьстрока в целое число, но я хотел бы знать, есть ли способ вместо этого использовать быстрые операции, такие как сдвиг и двоичная арифметика?

Ответы [ 3 ]

4 голосов
/ 07 марта 2013

Вот мысль о том, как использовать быстрые операции, такие как смещение байтов и десятичная арифметика, чтобы ускорить это. Предполагая, что у вас есть текущий код:

byte[] token;  // bytes representing a bunch of ascii numbers
int n = Integer.parseInt(new String(token));  // current approach

Тогда вы могли бы вместо этого заменить эту последнюю строку и сделать следующее (при условии, что нет отрицательных чисел, никаких иностранных символов языка и т. Д.):

int n = 0;
for (byte b : token)
  n = 10*n + (b-'0');

Из-за интереса это привело к ускорению примерно на 28% для массивного набора данных. Я думаю, что это связано с тем, что нет необходимости выделять новые String объекты, а затем очищать их после каждого parseInt вызова.

3 голосов
/ 07 августа 2011

Вам нужно два шага конвертации.Сначала преобразуйте ваши байты ascii в строку.Вот что new String(lne,"us-ascii") делает для вас. Затем , преобразовать строковое представление числа в фактическое число.Для этого вы используете что-то вроде Integer.parseInt(theString) - не забудьте обработать NumberFormatException.

1 голос
/ 07 августа 2011

Как вы говорите, new String(lne,"US-ASCII") даст вам правильную строку. Чтобы преобразовать вашу строку в целое число, используйте int myInt = Integer.parseInt(new String(lne,"US-ASCII"));

...