| 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());
}
}
Наверное все это можно провернуть как-то проще, ну да ладно.
Всем огромное спасибо за помощь!
Тему можно закрыть.
|