代码之家  ›  专栏  ›  技术社区  ›  Vlad Cristescu

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

  •  2
  • Vlad Cristescu  · 技术社区  · 8 年前

    我正在使用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在返回之前是否已GCed?或者我不知何故超出了范围? 你们能帮我吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   xaxxon    8 年前

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

    QByteArray data = file.readAll();
    

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

    从…起 http://v8.paulfryzel.com/docs/master/classv8_1_1_array_buffer.html :

    在现有内存块上创建新的ArrayBuffer。创建的 默认情况下,数组缓冲区立即处于外部化状态。这个 当创建的ArrayBuffer为 垃圾已收集。

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