2012-02-09 86 views
2

我有一個字節數組定義爲二進制陣列

unsigned char ptr = new unsigned char[1024]; 
fillWithSomething(ptr, 1024); 

然後,我需要將ptr變量存儲在V8發動機的Local< Array>變量或另一種V8數據類型。 目前,我將字節數組轉換爲字符串,以便存儲在Local< String>變量中,但是這種方法對我的應用程序來說是低效的。

在此先感謝。

地更新(由於維亞切斯拉格羅夫)

I測試與外部陣列的解決方案,但我不能使用它在我的node.js服務器代碼。我有以下代碼(在我延長側C++):

Handle<Object> array = Object::New(); 
array->SetIndexedPropertiesToExternalArrayData(getBytes(), kExternalUnsignedByteArray, bytesSize); 
return array; 

我的問題是,我如何使用array變量在我的服務器代碼(JavaScript)的調用函數GetIndexedPropertiesExternalArrayData()

再次感謝

回答

4

的最有效的方法是使用外部陣列

v8::Handle<v8::Object> external_array = v8::Object::New(); 
external_array->SetIndexedPropertiesToExternalArrayData(ptr, v8::kExternalUnsignedByteArray, 1024); 

外部陣列API使用(包括生命週期管理)的良好的例子可以在d8.cc找到:https://github.com/v8/v8/blob/7a0c55bd0d07135ce317f0e95909120eaafd5973/src/d8.cc#L394-L591

+0

Вячеслав,請你創建最小的例子來說明外部磁盤陣列的使用情況如何?因爲到目前爲止,似乎只有V8的委員會了解如何使用它們。挖掘到d8,沒有適當的背景知識只是痛苦和無用的。 – exebook

+1

@exebook很難創建比上面兩行代碼更簡單的示例。 –

+1

' template class test {};'也是最小的,但不會解釋什麼是模板。我使用嵌入式V8大約一年,我無法理解如何使用上面的最小示例。該函數有一個很長的名字,也許有人可能認爲是自我解釋,但我希望能夠在這些行被執行後從JS訪問這個數組。但是,不,數組在JS方面是空的。也許我期待錯誤的結果。無論哪種方式,它不明確(對我來說)。 – exebook

0

像Vya​​cheslav Egorov已經回答了

obj->SetIndexedPropertiesToExternalArrayData(data, 
              kExternalUnsignedByteArray, 
              length); 

是正確的答案。 如果你需要更多的例子,你可以檢查出https://github.com/joyent/node 他們使用很多v8 functionallity。

只是在項目的/ src文件夾grep -nrw ".*SetIndexedPropertiesToExternalArrayData.*" ".",你會得到很多的例子爲SetIndexedPropertiesToExternalArrayData