javascript - 使用 v8 读取二进制文件的函数

标签 javascript c++ qt v8 arraybuffer

我正在使用 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

我从我的 cpp 文件中检查了 v8::ArrayBuffer 中的数据。

我不能使用 String,因为读取非人类可读文件需要该函数,而且我不想在我的项目中包含 node.js。

不知何故 ArrayBuffer 在返回之前被 GC 了吗?还是我不知何故超出了范围? 你们能帮帮我吗?

谢谢!

最佳答案

我对 QT 了解不多,但看起来你正在将数组缓冲区指向堆栈上变量的数据

QByteArray data = file.readAll();

很可能(我不知道 QByteArray)在您从创建数组缓冲区返回后被清理。

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

Create a new ArrayBuffer over an existing memory block. The created array buffer is by default immediately in externalized state. The memory block will not be reclaimed when a created ArrayBuffer is garbage-collected.

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

关于javascript - 使用 v8 读取二进制文件的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39508344/

相关文章:

javascript - HTML/Javascript 显示用户输入(刷新问题)

javascript - 修复普通 Javascript 轮播的右侧按钮

c++ - QWebEnginePage 中的透明背景

c++ - 程序没有按顺序通过构造函数,从而导致未初始化的变量

php - 以编程方式创建冷锋矢量(天气)

javascript - 有没有办法调试 famo.us 应用程序中的渲染问题?

c++ - CMake 没有生成 Make 文件

c++ - 是否可以编写通用的重新绑定(bind)模板?

c++ - 获取基类的指针以使用派生类的函数

qt - 在 Qt 中保存一个 QImage