Вопрос

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

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

  • Наиболее значительный бит должен быть 0.
  • Должен быть выражен в заказе сетевого байта.

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

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

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

Это было полезно?

Решение

Если наиболее значимый бит должен быть нулевым, то число одинаково, независимо от того, подписано или не знаковое (при условии представления о дополнении двух). Так, например, 16 -битные целые числа с MSB Zero представляют цифры из 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, они работают, если аргумент представляет собой подписанное или без подписного целого числа.)

Другие советы

У Java нет беспигенных данных данных (см. Здесь: http://darksleep.com/player/javaandunsignedtypes.html)

INT имеет 32 -битный, Long имеет 64 -битный, Short имеет 16 -битный

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top