2015-02-18 1 views
4

Я хотел бы использовать структуру данных V8 Float32Array. Как я могу его инициализировать?Node C++ Addon - Как получить доступ к типизированному массиву (Float32Array), когда он был передан как аргумент?

Меня также будет интересовать прямой доступ к данным в память. Как это можно сделать?

+0

я основывал мою попытку до сих пор на: http://nodejs.org/api/addons .html. 'void ReadTypedArray (const FunctionCallbackInfo & args) { cout <<" args.length "<< (args.Length()); } 'И мне не удается форматировать комментарий в stackoverflow, потому что когда я нажимаю return, он сохраняет комментарий. – user1315172

+0

Раньше я читал буферы узлов как массивы символов, используя 'unsigned char * jpeg_input_buffer = (unsigned char *) Buffer :: Data (arg0);' – user1315172

+0

вы используете узел или чистый v8? – vkurchatkin

ответ

4

Обновленный

Лучший способ в настоящее время является использование помощника Nan::TypedArrayContents.

assert(args[i]->IsFloat32Array()); 
Local<Float32Array> myarr = args[i].As<Float32Array>(); 
Nan::TypedArrayContents<float32_t> dest(myarr); 
// Now use dest, e.g. (*dest)[0] 

Там хороший пример этого в node-canvas.


Оригинал ответа, который показывает, почему помощник полезно

v8 API быстро сейчас меняется так это зависит от версии узла/io.js. Для того, чтобы получить доступ к данным из массива, представленной в качестве аргумента, это должно работать для узла 0.12 через io.js < 3,0:

assert(args[i]->IsFloat32Array()); // These type-check methods are available. 
Local<Float32Array> myarr = args[i].As<Float32Array>(); 
void* dataPtr = myarr->GetIndexedPropertiesExternalArrayData(); 

В io.js> = 3.0 (v8 4.3) следует использовать вместо этого ArrayBuffer::GetContents. (Я еще не использовал это и обновит его, когда выпустят 3.0). Документы: here.

В узле 0.10 TypedArrays были заварены в домашних условиях. Это был один из способов сделать это:

Local<Object> buffer = args[i]->Get(NanNew("buffer"))->ToObject(); 
void* dataPtr = buffer->GetPointerFromInternalField(0); 

Построение массива набранное можно сделать с помощью:

Float32Array::New(ArrayBuffer::New(Isolate::GetCurrent(), size * 4), 0, size);