Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Проблема с UDP обменом между сервером и AIR приложением (http://www.flasher.ru/forum/showthread.php?t=153705)

jester88 19.04.2011 12:07

Сделал точно так как вы сказали, ошибка #2030 исчезла, но вместо поданной единицы (Double) получаю 3.0386519416174186e-319...

Котяра 19.04.2011 12:13

Тут уже дело в формате Double. Видать по разному интрепретируют.
Посмотрите, что приходит побитово:

Код AS3:

for (var i:int = 0; i < event.data.length; i++)
{
trace (event.data.readByte().toString(2));
}

покажите сюда.

jester88 19.04.2011 12:25

Получается так:
Код AS3:

0
0
0
0
0
0
-10000
111111

Добавлено через 6 минут
Я вот еще что заметил, когда пытался инты считывать. AIR только числа от 0 до 127 считывает корректно, число 128 для него уже интерпретируется не как 128, а как -128, 129 это -127 и так до 256, 256 соответсвенно становится нулем.

Добавлено через 8 минут
Единица, которую я посылаю в байтовом представлении выглядит так:
Код AS3:

0
0
0
0
0
0
240
63

Добавлено через 19 минут
Я так понимаю, что исходя из этого всего, единица в побитовом предсталении должна выглядеть так:
Код AS3:

0
0
0
0
0
0
11110000
111111

а AIR ее видит как:
Код AS3:

0
0
0
0
0
0
-10000
111111

Добавлено через 29 часов 16 минут
Всем привет!
Я все-таки решил проблему с приемом данных двойной точности.
Код AS3:

public function dataReceived(event:DatagramSocketDataEvent):void 
{
        //создаем массив wrongArray(), в который записываем приходящие байты
        wrongArray = new Array();
        //В Матлабе числа двойной точности Double разбивается на 8 байтов, например
        //число 11,53 представляется в виде [143, 194, 245, 40, 92 , 15, 39, 64].
        //Проблема заключается в том, что AIR интерпретирует входящие байты корректно только
        //в диапазоне от 0 до 127. Число 128 интерпретируется как -128, 129 как -127,
        //и так до 255, которое представляется как -1.
 
        for (var i:int = 0; i < event.data.length; i++)
        {
        //записываем в wrongArray() приходящие байты
        wrongArray.push(event.data.readByte());
        //создаем массив arrayB, с помощью этого массива будем изменять некорректные байты
        var arrayB:Array = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,-128,-127,-126,-125,-124,-123,-122,-121,-120,-119,-118,-117,-116,-115,-114,-113,-112,-111,-110,-109,-108,-107,-106,-105,-104,-103,-102,-101,-100,-99,-98,-97,-96,-95,-94,-93,-92,-91,-90,-89,-88,-87,-86,-85,-84,-83,-82,-81,-80,-79,-78,-77,-76,-75,-74,-73,-72,-71,-70,-69,-68,-67,-66,-65,-64,-63,-62,-61,-60,-59,-58,-57,-56,-55,-54,-53,-52,-51,-50,-49,-48,-47,-46,-45,-44,-43,-42,-41,-40,-39,-38,-37,-36,-35,-34,-33,-32,-31,-30,-29,-28,-27,-26,-25,-24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1];
        //в цикле заменяем числа, находящиеся в диапазоне [-128: -1] на [128:255]
        for (var j:int = 0; j < 255; j++)
        {
                if (wrongArray[i] == arrayB[j])
                {
                        //если i-ый элемент массива wrongArray окажется равен j-му элементу
                        //массива arrayB, то заменяем i-ый элемент массива wrongArray()на индекс
                        //j-ого элемента массива arrayB
                        var ind:int = j;
                        wrongArray[i] = ind;
                }
        }
        }
        //в Матлабе, как выяснилось, главный байт почему-то находится в конце, хотя в документации
        //написано, что в начале, поэтому необходимо обратить полученный массив wrongArray()
        wrongArray = wrongArray.reverse();
 
        //создаем байтовый массив ba() и записываем в него поэлементно весь массив wrongArray()
        ba = new ByteArray();
        for (var k:int = 0; k < wrongArray.length; k++)
        {
                ba[k] = wrongArray[k];
        }
        //наконец, когда получен корректный байтовый массив ba(), считываем
        //с помощью readDouble() данные из него по 8 байт
        for (var h:int = 0; h < ba.length; h+=8)
        {
                trace(ba.readDouble());
        }
}

Наверное все это можно провернуть как-то проще, ну да ладно.
Всем огромное спасибо за помощь!

Тему можно закрыть.


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

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