【问题标题】:Binary array using V8 engine使用 V8 引擎的二进制数组
【发布时间】:2012-03-02 08:40:36
【问题描述】:

我有一个字节数组定义为

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

然后,我需要将ptr 变量存储在V8 引擎的Local< Array> 变量或其他类型的V8 数据类型中。 目前,我正在将字节数组转换为字符串,以便存储在 Local< String> 变量中,但这种方法对我的应用程序来说效率低下。

提前致谢。

已更新(感谢 Vyacheslav Egorov)

我使用外部数组测试解决方案,但无法在我的 node.js 服务器代码上使用它。我有以下代码(在我的扩展端 C++):

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

我的问题是,如何在我的服务器代码 (javascript) 中使用 array 变量来调用函数 GetIndexedPropertiesExternalArrayData()

再次感谢

【问题讨论】:

    标签: bytearray type-conversion v8


    【解决方案1】:

    最有效的方法是使用外部数组

    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 中找到

    【讨论】:

    • Вячеслав,你能创建一个最小的例子来演示外部数组的用法吗?因为到目前为止,似乎只有 V8 的提交者了解如何使用它们。在没有适当背景知识的情况下深入研究 d8 是痛苦且无用的。
    • @exebook 很难创建比上面两行代码更小的示例。
    • template &lt;typename T&gt; class test {}; 也是最小的,但不会解释什么是模板。我使用嵌入式 V8 大约一年,我无法理解如何使用上述最小示例。该函数的名称很长,也许有人可能会认为不言自明,但我希望在执行这些行之后能够从 JS 访问这个数组。但是不,数组在 JS 端是空的。也许我期待错误的结果。无论哪种方式都不清楚(对我来说)。
    • @exebook 你说的空是什么意思?在执行SetIndexedPropertiesToExternalArrayData 之后,external_array 的元素 0 到 1023 应映射到 ptr 指向的内存区域的各个字节。其他都不会改变(例如,对象不会获得长度属性)。
    • @exebook 简单来说:obj-&gt;SetIndexedPropertiesToExternalArrayData(ptr, type, l)ptr 指向的内存区域作为元素存储附加到JS 对象obj。当您读/写0l - 1 之间的元素时,V8 将获取它/将其存储在该区域的相应部分中。每个元素的具体类型和大小由type 确定。例如。 v8::kExternalUnsignedByteArray 对应字节数组,v8::kExternalFloat64Array 对应双精度浮点值数组。
    【解决方案2】:

    Vyacheslav Egorov 已经回答了

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

    是正确的答案。 如果您需要更多示例,可以查看https://github.com/joyent/node 他们使用了大量的 v8 功能。

    只需将grep -nrw ".*SetIndexedPropertiesToExternalArrayData.*" "." 放在项目的/src 文件夹中,您就会得到很多SetIndexedPropertiesToExternalArrayData 的示例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2013-04-21
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 2013-01-02
      相关资源
      最近更新 更多