2016-09-15 59 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中此功能之後,ArrayBuffer在js文件中包含隨機數據,而不是文件的內容。

這裏是我的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內的數據。

我不能使用String,因爲需要讀取非人類可讀文件的功能,而且我不想在我的項目中包含node.js。

以某種方式返回之前的ArrayBuffer GCed?或者我以某種方式超出了範圍? 你們能幫我嗎?

謝謝!

回答

0

我不知道很多關於Qt,但它看起來像你指向數組緩衝區數據變量堆棧

QByteArray data = file.readAll(); 

這可能(我不知道的QByteArray)上獲得從創建陣列緩衝區返回後清除。

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

在現有的內存塊創建一個新的ArrayBuffer。創建的 數組緩衝區默認立即處於外部化狀態。當創建的ArrayBuffer爲 垃圾回收時, 內存塊將不會被回收。

所以我很確定它依靠你來確保它指向的內存保持有效,我認爲你沒有這樣做。