0

AS3 でリトルエンディアン ByteArray をビッグエンディアンに変換する方法は? bitmapData をビッグエンディアンの ByteArray に変換し、Adobe Alchemy を使用してメモリにプッシュします。そして、メモリから読み取ると、リトル エンディアンの ByteArray が得られます。ビッグエンディアンを取得する方法。

このコード例を使用しますhttp://blog.debit.nl/2009/03/using-bytearrays-in-actionscript-and-alchemy/ (Actionscript で直接アクセスする C でのメモリ割り当て (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;
4

1 に答える 1

4

しばらく前に、 Adobeフォーラムでこれについて質問しました。

Alchemyで実行されているコードと同様に、FlashVM自体はリトルエンディアンです。理由は不明ですが、多くのFlashAPIはバイトをビッグエンディアンとして返します。なんて奇妙なことでしょう。(おそらく、これはMacromedia時代のレガシーAPIのものです。誰が知っていますか?)

ByteArray.endianを設定しても、ByteArrayに格納されているバイトは変更されません。これは、readXXX / writeXXXの動作方法に影響します(つまり、読み取り/書き込み時にバイトが反転します)。

ただし、Alchemyコードはバイトを直接参照しているため(つまり、ByteArrayメソッドを使用していないため)、手動でフリッピングを処理する必要があります。これは、着信バイトと発信バイトにも当てはまることに注意してください。

バイトオーダーの反転に関する詳細については、こちらをご覧ください。

于 2011-06-11T20:36:54.430 に答える