2011-01-26 3 views
4

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

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

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

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

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

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

+1

Как вы относитесь к 4586 году? – I82Much

+0

Ужасно, если честно :) – Myn

+0

Ничего себе я думал, что я единственный в мире, делающий 4586! –

ответ

4

Целое число обычно составляет 4 байта. Но если вы храните небольшое число, например 99, остальные три байта содержат 8x 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 можно использовать для объединения трех меньших чисел.

+0

Ah..I beleive Я неверно истолковал «Integer 4» часть спецификации - как вы, так и T.J. скажем, он должен означать, что это целое число, а не целочисленный тип. Я смотрел на это своим мозгом в режиме программирования, это внезапно приобретает гораздо больший смысл!Большое спасибо за код, это похоже на то, что мне нужно, хотя я не буду требовать функции toInt, поскольку я полагаю, что он будет использоваться как байтовый массив. Огромное вам спасибо, вы только что выяснили, что меня повредило все утро! – Myn

+0

В качестве последующего вопроса, будет ли такая же работа с двойным или символом? Итак, вместо двойного «51.304215» или строки «T-321», байтового массива? – Myn

+0

Вы всегда можете принуждать и смещать бит в любое хранилище .. поскольку они заканчиваются байтами. – RichardTheKiwi

3

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

Так что в основном вы хотите посмотреть на свою идентификационную вещь как на серию из четырех значений byte. Опасайтесь, что тип Java byte подписан.

+0

Тот же комментарий, что и в cyberkiwi, если бы я мог дать два лучших ответа, но большое вам спасибо, ваши объяснения были исключительно полезными. – Myn

+0

@Myn: Не беспокойтесь, рад, что помог. –

1

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

Смежные вопросы