Преобразовать байтовый массив с прямым порядком байтов в 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), он должен обрабатывать переворачивание вручную. Обратите внимание, что это верно как для входящих байтов, так и для исходящих байтов.
Дополнительная информация о порядке следования байтов здесь.