JavaScript — функция для чтения двоичных файлов с использованием 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 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

Я проверил данные внутри v8 :: ArrayBuffer из моего файла cpp.

Я не могу использовать String, потому что эта функция требуется для чтения файлов, которые не предназначены для чтения человеком, и я не хочу включать node.js в мой проект.

Как-нибудь ArrayBuffer GCed до возвращения? Или я как-то вне поля зрения?
Ребята, вы можете мне помочь?

Спасибо!

2

Решение

Я не знаю много о QT, но похоже, что вы указываете буфер массива на данные для переменной в стеке

QByteArray data = file.readAll();

это вероятно (я не знаю, QByteArray) очищается после того, как вы вернетесь из создания буфера массива.

От http://v8.paulfryzel.com/docs/master/classv8_1_1_array_buffer.html:

Создайте новый ArrayBuffer поверх существующего блока памяти. Созданный
буфер массива по умолчанию находится сразу во внешнем состоянии.
блок памяти не будет восстановлен, когда созданный ArrayBuffer
сборщиком мусора.

Так что я уверен, что он полагается на то, что память, на которую он указывает, остается действительной, что, я думаю, вы не делаете.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]