#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));
}