我正在使用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?或者我以某種方式超出了範圍? 你們能幫我嗎?
謝謝!