2016-09-15 2 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); 
} 

문제는 자바 스크립트에서이 함수를 호출 한 후, JS 파일에 ArrayBuffer 임의의 데이터 대신 파일의 내용을 포함하고 있다는 점이다.

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의 출력 여기

내 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 내의 데이터를 검사했습니다.

사람이 읽을 수없는 파일을 읽는 데 함수가 필요하며 node.js를 프로젝트에 포함하지 않으므로 String을 사용할 수 없습니다.

어떻게 든 ArrayBuffer가 반환되기 전에 GCed됩니까? 아니면 어떻게 든 범위를 벗어나나요? 너희들 도와 줄 수있어?

감사합니다.

답변

0

얻는다 나는 QT에 대해 잘 모르겠지만, 당신은 아마 (내가 QByteArray를 모르는) 스택

QByteArray data = file.readAll(); 

에 변수에 대한 데이터를 배열 버퍼를 가리키는 것 같습니다 배열 버퍼를 만들 때 돌아온 후에 정리됩니다.

http://v8.paulfryzel.com/docs/master/classv8_1_1_array_buffer.html에서 :

기존의 메모리 블록을 통해 새로운 ArrayBuffer을 만듭니다. 생성 된 배열 버퍼는 기본적으로 즉시 외부화 된 상태입니다. 생성 된 ArrayBuffer가 쓰레기 수거 될 때 메모리 블록은 회수되지 않습니다.

그래서 나는 당신이하고 있다고 생각하지 않는 메모리가 유효하다는 것을 확인하기 위해 당신에게 의존하고 있다고 확신합니다.

관련 문제