Преобразовать байтовый массив с прямым порядком байтов в Big3 с прямым порядком байтов в AS3

Как преобразовать байтовый массив Little-endian в Big-endian в AS3? Я конвертирую bitmapData в байтовый массив с прямым порядком байтов и затем помещаю его в память с помощью Adobe Alchemy. А потом, когда я читаю это из памяти, я получаю байтовый массив Little-endian. Как получить Big-Endian.

Я использую этот пример кода http://blog.debit.nl/2009/03/using-bytearrays-in-actionscript-and-alchemy/ (Распределение памяти в C с прямым доступом в Actionscript (FAST!!))

Код:

var ba:ByteArray = currentBitmapData.getPixels( currentBitmapData.rect );
ba.position = 0;

var ns:Namespace = new Namespace("cmodule.al_exam");
var data:ByteArray = (ns::gstate).ds; //point to memory

_dataPosition = lib.initByteArray(ba.length); //This is the position of the data in memory          
lib.writeData(ba); //example function to write data in C
data.position = _dataPosition; //reset position

// get noise, not image
bmd.setPixels(currentBitmapData.rect,data);
myBitmap.bitmapData = bmd;

1 ответ

Некоторое время назад я спрашивал об этом на форумах Adobe.

Сама Flash VM является Little Endian, как и код, работающий в Alchemy. По непонятным причинам многие Flash API возвращают байты как Big Endian. Как странно. (Возможно, это устаревшая технология API со времен Macromedia. Кто знает?)

Установка ByteArray.endian не изменяет байты, хранящиеся в ByteArray. Это влияет на то, как readXXX/writeXXX работает (то есть они будут переворачивать байты при чтении / записи).

Однако, так как ваш код Alchemy смотрит на байты напрямую (т.е. не использует методы ByteArray), он должен обрабатывать переворачивание вручную. Обратите внимание, что это верно как для входящих байтов, так и для исходящих байтов.

Дополнительная информация о порядке следования байтов здесь.

Другие вопросы по тегам