Проблема с чтением массива байтов в Adobe Alchemy - PullRequest
0 голосов
/ 03 февраля 2011

Я пытаюсь отправить байтовый массив, извлеченный из файла, в код C и снова вернуть этот байтовый массив из кода C ..

Я печатаю содержимое возвращаемого значения из C в текстовом представленииcontent.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);
}

1 Ответ

0 голосов
/ 03 февраля 2011

Я тоже немного застрял в этом. Это лучшее, что я придумал, это передать все необходимые вам байтовые массивы в функцию c. В моем случае я передаю один байтовый массив входных данных и передаю другой пустой byteArray для функции c, в которую помещаются выходные данные. Затем функции c не нужно создавать byteArray (я не смог заставить его работать), а функции c не нужно возвращать значение.

AS код:

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;
}

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

** ОБНОВЛЕНИЕ

Я обнаружил, что он пропускает ByteArrays, только если я создаю новый CLibInit более одного раза. То есть, если использовать статический экземпляр и инициализировать его только тогда, когда все в порядке.

например,

    static private var _myLibLoader = new CLibInit();
    static private var _myLib = _myLibLoader.init();
...