2016-09-15 46 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为 垃圾回收时, 内存块将不会被回收。

所以我很确定它依靠你来确保它指向的内存保持有效,我认为你没有这样做。