2012-02-09 85 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