2016-09-15 17 views
2

QTとv8を使用してJavascriptインタプリタを開発しています。v8を使用してバイナリファイルを読み取る機能

指定されたパスからバイナリファイルを読み取る関数を作成する必要があります。

これはそれを行うには、私のC++コードです:

void ScriptThread::ReadFile(const v8::FunctionCallbackInfo<v8::Value>& args) 
{ 
    if (v8::V8::IsExecutionTerminating(args.GetIsolate()) || instance->m_killFlag) 
     return; 
    v8::HandleScopehandle_scope(args.GetIsolate()); 
    if (args.Length() != 1) 
    { 
     args.GetIsolate()->ThrowException(
      v8::String::NewFromUtf8(args.GetIsolate(), "Bad parameters")); 
     return; 
    } 

    v8::String::Utf8Value str(args[0]); 
    QString filepath = *str; 

    QFile file(filepath); 
    if (!file.open(QFile::ReadOnly)) 
    { 
     return; 
    } 

    QByteArray data = file.readAll(); 

    v8::Local<v8::ArrayBuffer> ab = v8::ArrayBuffer::New(args.GetIsolate(), (void*)data.data(), data.size()); 

    args.GetReturnValue().Set(ab); 
} 

問題はJavascriptでこの関数を呼び出した後、JSファイル内ArrayBufferはなく、ファイルの内容のランダムなデータが含まれていることです。ここで

は、私のJSコードです:

var buffer = ReadFile("D:/Temp/myfolder/ascii.txt") 

Log(buffer) 

var view = new Uint8Array(buffer) 

Log(view) 
Log(String.fromCharCode.apply(null, view)) 

D:/Temp/myfolder/ascii.txt:変更せずに、スクリプトを数回実行した後

ABCDEF 

と私のJSの出力ファイルパス:

2016-09-15 12:42:35.847 Script Info [object ArrayBuffer] 
2016-09-15 12:42:35.847 Script Info 200,29,125,195,254,136 
2016-09-15 12:42:35.847 Script Info È}Ãþ 
2016-09-15 12:42:35.847 Info   Script Stopped 

2016-09-15 12:43:41.543 Script Info [object ArrayBuffer] 
2016-09-15 12:43:41.543 Script Info 238,254,238,254,238,254 
2016-09-15 12:43:41.543 Script Info îþîþîþ 
2016-09-15 12:43:41.543 Info   Script Stopped 

2016-09-15 12:47:19.588 Script Info [object ArrayBuffer] 
2016-09-15 12:47:19.588 Script Info m 
2016-09-15 12:47:19.588 Script Info 30,25,109,30,0,0 
2016-09-15 12:47:19.588 Info   Script Stopped 

私はcppファイルからv8 :: ArrayBuffer内のデータをチェックしました。

人間が読めないファイルを読み込む必要があり、プロジェクトにnode.jsを含めたくないため、Stringを使用できません。

何とかArrayBufferが返される前にGCedされていますか?それとも、私は何とかスコープから外れていますか? あなたは私を助けることができますか?

ありがとうございます!

答えて

0

取得私はQTについて多くを知らないが、あなたはおそらく(私はQByteArrayを知らない)スタック

QByteArray data = file.readAll(); 

に変数のデータに配列バッファを指しているように見えます配列バッファの作成から戻った後にクリーンアップされます。

http://v8.paulfryzel.com/docs/master/classv8_1_1_array_buffer.htmlから:

既存のメモリブロックの上に、新たなArrayBufferを作成します。作成された アレイバッファは、デフォルトでは直ちに外部化された状態になります。作成されたArrayBufferが ガベージコレクトされている場合、 メモリブロックは再利用されません。

だから私はそれがあなたがやっているとは思わないメモリが有効であることを確認することがあなたに頼っていると確信しています。

関連する問題