函数读取二进制文件使用v8
Function to read binary files using v8
我正在使用QT和v8开发一个Javascript解释器。
我需要创建一个可以从指定路径读取二进制文件的函数。
这是我的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
我检查了v8::ArrayBuffer中的数据从我的cpp文件。
我不能使用String,因为该函数需要读取非人类可读的文件,我不想在我的项目中包含node.js。
是在返回之前的某种方式的ArrayBuffer GCed ?还是我不知怎么地超出了范围?你们能帮帮我吗?
谢谢!
我对QT不太了解,但看起来你正在将数组缓冲区指向堆栈上变量的数据
QByteArray data = file.readAll();
可能(我不知道QByteArray)被清理后,您从创建数组缓冲区返回。
从http://v8.paulfryzel.com/docs/master/classv8_1_1_array_buffer.html:
在现有内存块上创建一个新的ArrayBuffer。创建的默认情况下,数组缓冲区立即处于外部化状态。的当创建的ArrayBuffer被回收时,不会回收内存块垃圾收集。
所以我很确定它依赖于你来确保它指向的内存仍然有效,我认为你没有这样做
相关文章:
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 函数读取二进制文件使用v8