Преобразование необработанных байтовых значений в типы Java

StackOverflow https://stackoverflow.com/questions/4708141

  •  11-10-2019
  •  | 
  •  

Вопрос

У меня проблема с преобразованием необработанных байтовых значений в типы java.Я получаю байты через сокет дейтаграммы в виде массива байтов.Я точно знаю, какие байты что означают, но я не знаю, как их соответствующим образом преобразовать (я имею в виду, я знаю смещения, но не знаю, правильно ли то, что, по моему мнению, я получил ;)).

Например, я хочу преобразовать 16-битный unsigned short в java int type.Я нашел несколько примеров в Интернете, один из них:

public int getUShort(byte[] bytes, int offset) {
    int b0 = bytes[offset] & oxFF;
    int b1 = bytes[offset + 1] & oxFF;

    return (b1 << 8) + (b0 << 0);

Еще один такой же, но последняя строка такая:

return (b0 << 8)  + b1;

Конечно, это дает разные результаты.Какой из них правильный?Не могли бы вы, пожалуйста, привести мне также действительный пример, как сделать то же самое, но для неподписанного long?

Заранее благодарю вас!

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

Решение

Вы можете использовать DataInputStream или ByteBuffer для чтения различных типов. Вы можете использовать подписанные типы в качестве беспигнированных значений для большинства операций точно так же. Я написал простой класс, чтобы проиллюстрировать, как вы можете использовать подписанные типы, как если бы они были без подписи Без знака

ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();

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

Некоторое время назад мне пришлось проделать кое-какую работу, подобную этой, и я обнаружил, что лучший способ выполнить такого рода работу - использовать ByteBuffer и его преобразования в DoubleBuffer, LongBuffer, и т.д.Вы можете преобразовать массив байтов в ByteBuffer позвонив

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

Оттуда вы можете получить представление о байтах в виде списка intы, позвонив

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

и затем вы можете преобразовать байты, вызвав

int nextInt = myIntBuffer.get();

Эти классы также имеют широкую поддержку операций массового получения, поэтому, если вы точно знаете, что получаете по сети целую кучу данных одного и того же типа, вы можете выполнять преобразования очень быстро.

Альтернативным подходом было бы, если это вообще возможно, использовать какую-либо сериализацию на основе Java для отправки данных по сети.Это позволяет вам выполнять преобразования гораздо проще, используя классы stream writer.Конечно, это может быть недоступно, особенно если вы общаетесь с сервером, отличным от Java, но, возможно, стоит изучить.

Действительно поздно на этом.

Оба правильны на основе эндсианты данных. Глянь сюда: http://en.wikipedia.org/wiki/endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top