16-разрядные и 64-разрядные целые числа без знака - PullRequest
2 голосов
/ 05 сентября 2011

Как вы производите 16-разрядное целое число без знака и 64-разрядное целое число без знака в Java? Этот вопрос связан с реализацией стандарта. Я не могу изменить спецификацию.

Другие, возможно, соответствующие биты спецификации. этот вопрос связан с:

  • старший бит ДОЛЖЕН быть 0.
  • должно быть выражено в сетевом порядке байтов.

Контекст приложения: число (в любой форме) представляет длину отправляемых данных. Длина может быть большой или маленькой. Сначала я нашел длину сообщения, которое будет отправлено как длинное.

Итак, я начинаю с: long length = getLength();

Затем мне нужно преобразовать длинную переменную "length" в любую из двух приведенных выше, в зависимости от ее размера. В конце концов, я почти уверен, что мне нужно будет сделать .getBytes() при отправке длины. Получатель будет интерпретировать, как описано выше.

Ответы [ 2 ]

6 голосов
/ 05 сентября 2011

Если старший значащий бит должен быть нулем, то число одинаково, независимо от того, подписано оно или нет, (при условии представления дополнения до двух). Так, например, 16-битные целые числа с нулем MSB представляют числа от 0 до 32767 включительно.

Предполагая, что вы пишете в OutputStream и что ваше определение "сетевого порядка" сначала является наиболее значимым байтом, затем вам нужно сделать что-то вроде этого:

public void writeShort(OutputStream os, short s) throws IOException {
    os.write((byte) (s >> 8));
    os.write((byte) s);
}

и

public void writeLong(OutputStream os, long l) throws IOException {
    os.write((byte) (l >> 56));
    os.write((byte) (l >> 48));
    os.write((byte) (l >> 40));
    os.write((byte) (l >> 32));
    os.write((byte) (l >> 24));
    os.write((byte) (l >> 16));
    os.write((byte) (l >> 8));
    os.write((byte) l);
}

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

1 голос
/ 05 сентября 2011

В Java нет неподписанных типов данных (см. Здесь: http://darksleep.com/player/JavaAndUnsignedTypes.html)

int имеет 32-битную, long-64-битную, short-16-битную

Так плохо хранить все это так же долго?

...