|
|
|||||
ReadLong from ByteArray
Попросили помощи в одном интересном вопросе. Сам не достаточно компетентен в данном вопросе, т.е. тоже интересно.
С сокет-сервера получаем данные (Endian.LITTLE_ENDIAN). Среди массива данных имеется Цитата:
9578088909 Вот инвертнутый массив (в формате BIG_ENDIAN): Цитата:
public function readUnsignedLong():Number { //TODO error check length return ((readUnsignedByte() & 255) << 56) + ((readUnsignedByte() & 255) << 48) + ((readUnsignedByte() & 255) << 40) + ((readUnsignedByte() & 255) << 32) + ((readUnsignedByte() & 255) << 24) + ((readUnsignedByte() & 255) << 16) + ((readUnsignedByte() & 255) << 8) + ((readUnsignedByte() & 255) << 0); } 988154319 988154319 != 9578088909 В чем косяк? Спасибо за помощь.
__________________
Ну все, теперь Забава м-о-я. Гы-гы, а корабль мой! |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
При всем желании, в Number не запихнуть int64, без потери точности.
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Регистрация: Nov 2010
Сообщений: 497
|
Совершенно банально число не влезает. 988154319 - это 0x3AE609CD. В документации
Цитата:
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Вот так должно работать, вплоть до 53 битного заполнения входящего Long
public function readUnsignedLong() : Number { return ((readUnsignedByte() & 0xFF) * Math.pow(2, 56)) + ((readUnsignedByte() & 0xFF) * Math.pow(2, 48)) + ((readUnsignedByte() & 0xFF) * Math.pow(2, 40)) + ((readUnsignedByte() & 0xFF) * Math.pow(2, 32)) + ((readUnsignedByte() & 0xFF) * Math.pow(2, 24)) + ((readUnsignedByte() & 0xFF) * Math.pow(2, 16)) + ((readUnsignedByte() & 0xFF) * Math.pow(2, 8)) + ((readUnsignedByte() & 0xFF)); }
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Я извиняюсь, но разве long это не 4 байта??
Цитата:
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
Посмотрите, что выдаст битовый сдвиг влево на 56 битов для любого числа. (операция возвращает не Number, а 32-битный int)
И, собственно, прослезитесь. Нужно умножать на 2^56, или как-то так. Добавлено через 2 минуты Не успел =)) |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Цитата:
long - занимает двойное машинное слово (DWORD). Соответственно, он должен быть длиннее int в два раза. Вот и получаем 4 * 2 = 8 байт для long. Могу ошибаться. Поправьте если что.
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
http://en.wikipedia.org/wiki/Integer...#C_and_C.2B.2B
4 байта в 32х и 8 байт в 64х Добавлено через 2 минуты В данном случае число : 9 578 088 909 может быть одним из : Цитата:
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
Часовой пояс GMT +4, время: 04:45. |
|
« Предыдущая тема | Следующая тема » |
|
|