Unsigned 16 и 64 -битные целые числа
-
26-10-2019 - |
Вопрос
Как вы производите 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 -битный
Это так плохо хранить все так же долго?