Четыре целых числа в четырех байтах? - PullRequest
4 голосов
/ 26 января 2011

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

Я работаю с документом STANAG, в котором указаны следующие слова:

идентификационные номерадолжны быть сформированы как 4-байтовые числа.Первый (самый значимый) байт должен быть стандартным кодом страны НАТО для рассматриваемого объекта.Допустимые коды стран должны быть в диапазоне от 0 до 99 десятичных знаков ... Код страны 255 (шестнадцатеричный FF) должен быть зарезервирован.

Затем подробно описываются три других байта.В спецификации идентификатору присваивается тип Integer 4, где Integer n - целое число со знаком, а n - 1,2 или 4 байта.

Мой вопрос, и я признаю, что это можно считать невежественным вопросоми я прошу прощения, что целое число, как мы знаем, 32 бита / 4 байта.Как может быть «первый байт», например, 99, когда 99 - это целое число?

Буду очень признателен за любые разъяснения здесь.

Ответы [ 3 ]

4 голосов
/ 26 января 2011

Целое число обычно составляет 4 байта. Но если вы храните небольшое число, например, 99, остальные три байта хранят 8 битов 0-значного значения. Спецификация просит вас использовать одно целочисленное хранилище (4 байта) для хранения 4 различных меньших чисел в своих байтах.

Самый простой способ - использовать функцию toInt для массива из 4 байтов, например (нет проверки длины байта [] и эта функция не проверена - она ​​только для иллюстрации)

public static final int toInt(byte[] b) 
{
    int l = 0;
    l |= b[0] & 0xFF;
    l <<= 8;
    l |= b[1] & 0xFF;
    l <<= 8;
    l |= b[2] & 0xFF;
    l <<= 8;
    l |= b[3] & 0xFF;
    return l;
}

byte[] bytes = new byte[] {99, 4, 9, 0};
int i = toInt(bytes, 0);

32-битное значение типа int

11110101   00000100   00001001   00000000
^byte      ^byte      ^byte      ^byte

Каждого блока из 8 битов в int достаточно, чтобы «закодировать» / «сохранить» меньшее число. Таким образом, int может использоваться для объединения 4 меньших чисел.

3 голосов
/ 26 января 2011

"99" - математически целое число, но не обязательно Integer или int с точки зрения Java. Значение 99 может удерживаться, например, short (что сокращенно от "короткого целого"), которое является 16-битным типом данных, или byte, которое является 8-битным типом данных.

Так что, в общем, вы захотите рассматривать их идентификаторы как последовательность из четырех byte значений. Помните, что тип Java byte подписан.

1 голос
/ 26 января 2011

Целое число (вне вычислений) означает любое значение без десятичной дроби, которое включает 2, 99, -5, 34134, 427391471244211 и т. Д. В вычислительном выражении целое число (традиционно) представляет собой 32-разрядное число, которое можетзначение, которое будет в нем вписываться.Каждый байт (8 битов) этого (вычислительного) целочисленного значения также является отдельным (числовым) целым числом от 0 до 255.

...