2011-02-03 5 views
0

私はCコードから再びByteArrayのCコードとリターンにファイルから抽出したByteArrayを送信しようとしています。..アドビ錬金術バイト配列の読み取りに問題

私はCからの戻り値の内容を印刷していますテキストビューではcontents.textですが、わかることができるのはバイト配列オブジェクト "OggS"です。私はバイト配列の内容を見ることができません。誰かが私が間違っていると言うことができますか?..私はCコードとASコードを投稿しました。

AS Code: 
private function copyByteArray(content:String):void{ 

     try{ 

     byteData = new ByteArray(); 
     //byteData.writeUTFBytes(contents); 
     var dec:Base64Decoder = new Base64Decoder(); 
     dec.decode(content); 
     byteData = dec.toByteArray(); 
     //Alert.show("byte Array " + byteData +" :: " +contents.length); 

     var file:File = File.desktopDirectory.resolvePath("Files/test.spx"); 
     stream = new FileStream(); 
     stream.open(file, FileMode.WRITE); 


     /* var loader:CLibInit = new CLibInit(); 
     var lib:Object = loader.init(); 
     loader.supplyFile("testFile.txt", byteData); 
     contents.text = lib.sqre(5);*/ 

     var loader:CLibInit = new CLibInit(); 
     var lib:Object = loader.init(); 
    // var result:String = lib.doMagic(byteData); 




     var byteArr:ByteArray; 
     var byteStr:String; 
    //byteArr.writeBytes(byteData, 0 , byteData.length); 

    loader.supplyFile("test1.txt" , byteData); 
    byteStr = lib.readFile("test1.txt"); 
    contents.text = byteStr; 


    //stream.writeBytes(); 
     stream.close(); 

    } 
    catch (ex: ErrorEvent){ 
     Alert.show("error"); 

    } 
} 

Cコード:

static AS3_Val readFile(void* self, AS3_Val args) 
{ 
    char * fileName; 
    FILE * file; 
    long fileSize; 
    char * buffer; 

    AS3_ArrayValue(args, "StrType", &fileName); 

    file = fopen(fileName,"rb"); 

    //Get file size 
    fseek (file, 0, SEEK_END); 
    fileSize = ftell(file); 
    rewind(file); 

    //Allocate buffer 
    buffer = (char*) malloc(sizeof(char)*fileSize); 

    //Read file into buffer 
    fread(buffer, 1, fileSize, file); 

    //close file and free allocated buffer 
    fclose (file); 
    free (buffer); 

    return AS3_String((char*)buffer); 
} 

答えて

0

私もこれに引っかかっビットです。私が思いついたこのベストは、必要なすべてのbyteArraysをc関数に渡すことです。私の場合、私は1バイトの配列の入力データを渡し、出力データを入れるc関数のために別の空のbyteArrayを渡します。 c関数はbyteArrayを作成する必要はありません(私はそれを動作させることができませんでした)、c関数は値を返す必要はありません。コードとして

public function actionscriptFunction() { 

    var myInputData:ByteArray = new ByteArray(); 
    -- maybe load a file or something into myInputData 

    var myOutputData:ByteArray = new ByteArray(); 

    var loader:CLibInit = new CLibInit(); 
    var lib:Object = loader.init(); 
    lib.readFile(myInputData, myOutputData); 

    -- do something with the output data 
} 

Cコード:

static AS3_Val readFile(void *self, AS3_Val args) { 

    AS3_Val inData_arg = AS3_Undefined(); 
    AS3_Val outData_arg = AS3_Undefined(); 
    AS3_ArrayValue(args, "AS3ValType, AS3ValType", &inData_arg, &outData_arg); 

    AS3_Val inDataLength = AS3_GetS(inData_arg, "length"); 

    -- do something with input data, fill output data array 

    // try to stop it leaking  
    // AS3_ReleaseX(wavData_arg); AS3_ReleaseX(dstData_arg); AS3_ReleaseX(logFile_arg); 
    // AS3_ReleaseX(args); 
    return AS3_Null; 
} 

しかし、何でも私がしよう、これはByteArrayとして定義をリークので、私はより良い方法がなければならないと思います。

** UPDATE

私は私が複数回新しいCLibInitを作成する場合にのみByteArrayとして定義をリークすることを見出しました。つまり、静的インスタンスを使用して初期化する場合は、すべて正常です。

例えば、

static private var _myLibLoader = new CLibInit(); 
    static private var _myLib = _myLibLoader.init(); 
関連する問題