Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   protobuf-actionscript3 не пишет тип Number (http://www.flasher.ru/forum/showthread.php?t=151097)

kyzi007 22.02.2011 15:49

protobuf-actionscript3 не пишет тип Number
 
Насколько я поняла это официально зафиксированный баг.
Может кто-то фиксил напильником?

wvxvw 23.02.2011 01:13

Я просто не совсем в курсе, а к какому из протобаф типов относится флешевый Number? И нельзя ли заменить на int / uint?

Котяра 23.02.2011 01:48

не встречал этого бага. А можно подробности?
Вот методы чтения/записи
Код AS3:

          /** Read a {@code float} field value from the stream. */
          public function readFloat():Number {
            return readRawLittleEndian32();
          }
 /** Read a 32-bit little-endian integer from the stream. */
          public function readRawLittleEndian32():int {
            var b1:int = readRawByte();
            var b2:int = readRawByte();
            var b3:int = readRawByte();
            var b4:int = readRawByte();
            return ((b1 & 0xff)      ) |
                  ((b2 & 0xff) <<  8) |
                  ((b3 & 0xff) << 16) |
                  ((b4 & 0xff) << 24);
          }

Код AS3:

          /** Write a {@code float} field, including tag, to the stream. */
          public function writeFloat(fieldNumber:int, value:Number):void {
            writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32);
            writeRawLittleEndian32(value);
          }
          /** Write a little-endian 32-bit integer. */
          public function writeRawLittleEndian32(value:int):void {
            writeRawByte((value      ) & 0xFF);
            writeRawByte((value >>  8) & 0xFF);
            writeRawByte((value >> 16) & 0xFF);
            writeRawByte((value >> 24) & 0xFF);
          }

UPD. Да есть косяк. Number преобразовывается в int
Мне как то не попадались float в моих проектах. Поэтому баг не замечал.

kyzi007 23.02.2011 11:56

И еще я смогла прочитать только свою ютф строку:)
То что сделал серверщик недопереварилось.
А я в записях в байтах ни в зуб ногой(
Второй рабочий день и показала ся дубом(

А изменять на инты нельзя.

wvxvw 23.02.2011 18:27

Код:

0        Varint        int32, int64, uint32, uint64, sint32, sint64, bool, enum
1        64-bit        fixed64, sfixed64, double
2        Length-delimited        string, bytes, embedded messages, packed repeated fields
3        Start group        groups (deprecated)
4        End group        groups (deprecated)
5        32-bit        fixed32, sfixed32, float

Это типы которые может записать протобаф. Каким образом вы записиваете флешевый Number?

kyzi007 23.02.2011 19:24

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

wvxvw 23.02.2011 20:15

Хорошо... поставим вопрос по-другому... на каком языке написана принимающая сторона, что принимающая сторона ожидает получить? Самое простое решение было бы записывать Number просто как 8 байт (ByteArray), и тогда если на принимающей стороне существует аналог Number от туда его и прочитать. Есть еще вариант, записать Number как 2 int64, один знаковый для целой части, другой - нет - для дробной. Этого бы точно хватило, чтобы Number поместился. Но это ровно в 2 раза больше, чем нужно для того, чтобы записать Number.

kyzi007 23.02.2011 20:44

Так я в самом флеше не могу прочитать что сформировала.
Делать два инта мне запретили.
Чесно гря даже не знаю на чем сервер, помоему на си.

Они хотят чтобы все работало без костылей. И без правки серверной части протобуфа.
А дробные числа будут туда-сюда летать толпами и со свистом...

Alex Lexcuk 23.02.2011 21:13

если он дробные не может передавать, прийдется альтернативы использовать: байтаррай, строкой, можно нумбер умножить на 10000 и получиться инт, сервер один фиг, чего то делает с данными, пусть делит инт на 10000 и будут нормальные нумберы.

wvxvw 23.02.2011 23:18

Ну дробные - вы определитесь, может вам хватит float? И вы не ответили на вопрос. Как сервер присылает Number - откуда вы его пробуете прочитать? (В protobuf есть float - это, на сколько я понимаю 32 бита, и есть double, это, по-идее и должен быть флешевый Number). Если мое предположение правильное, то используйте соответствующие методы ByteArray - read/writeFloat и read/writeDouble... Я не уверен какой endian используется в protobuf, но, опять же, вариантов у вас всего два, если не big endian, то small endian.


Часовой пояс GMT +4, время: 23:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.