Чтение беззнаковой длины в конце строки в Java

#java #endianness

#java #порядковый номер

Вопрос:

Я новичок в Java (я перехожу с C / C ), и мне нужно прочитать 4-байтовое число без знака, хранящееся в LittleEndian.

Моя функция не работает (я только что закончил поиск в Интернете, и это кажется правильным …)

 public long readlU32() throws IOException {
                long dword = 0;
                for(int i = 0; i < 4; i  )
                        dword = (dword << 8) | readU8();
                return dword;
        }
  

Я видел здесь другие вопросы, и это должно сработать… Что не так?

PS: Значение, которое я должен прочитать, равно 0x94010000, поэтому значение должно быть 404, но программа считывает его как 2483093504 (большое конечное значение)…

Комментарии:

1. Длина в java составляет 8 байт. Вы пробовали использовать 8 вместо 4?

2. Вы сдвигаете первый байт, который вы читаете больше всего, влево. Это сделало бы первый байт самым большим, так что да, вы реализовали чтение большого порядкового номера.

Ответ №1:

Вы сдвигаете байты так, чтобы «самый левый» байт по-прежнему оставался «самым левым». Вы преобразуете битовое представление 404 в виде небольшого 0x94010000 конечного порядкового номера в то, что оно будет представлять в big-endian, то есть 2483093504 .

Попробуйте это, которое сдвинет каждый прочитанный байт в long байты, начиная с конца.

 for(int i = 0; i < 4; i  )
{
    dword = dword | (readU8() << (8 * i));
}