Node.js 如何使用指针和强制转换从缓冲区(如C中)映射结构

Node.js 如何使用指针和强制转换从缓冲区(如C中)映射结构,node.js,Node.js,在C中,我可以定义许多结构和结构的结构。 在缓冲区中,我可以在这个结构的开头设置指针,表示这个缓冲区代表这个结构 当然,我不想复制任何东西,只是映射,否则我失去了速度的好处 在NodeJs中可能吗?我该怎么办?我怎样才能确保它是一个映射,而不是创建一个新对象并在其中复制信息 例如: struct House = { uint8 door, uint16BE kitchen, etc... } var mybuff = Buffer.allocate(10, 0) var MyHou

在C中,我可以定义许多结构和结构的结构。 在缓冲区中,我可以在这个结构的开头设置指针,表示这个缓冲区代表这个结构

当然,我不想复制任何东西,只是映射,否则我失去了速度的好处

在NodeJs中可能吗?我该怎么办?我怎样才能确保它是一个映射,而不是创建一个新对象并在其中复制信息

例如:

struct House = {
  uint8 door,
  uint16BE kitchen,
  etc...
}

var mybuff = Buffer.allocate(10, 0)
var MyHouse = new House(mybuff) // same as  `House* MyHouse = (House*) mybuff`
console.log(MyHouse.door) // will display the value of door
console.log(MyHouse.kitchen) // will display the value of kitchen with BE function.
这是错误的,但请解释清楚我在寻找什么。 这本书没有复制任何东西

如果我做我的房子。门=56,我的buff包含知道56。我认为MyBufff是一个指针。

< P>以下问题更新编辑< /P> 与C/C++相反,javascript默认使用pionters,因此您无需做任何事情。事实上,情况正好相反:如果您想要当前对象的副本,您必须付出一些努力

在C语言中,结构只不过是对结构中数据不同部分的编译时引用。因此:

struct X {
    int foo;
    int bar;
}
只不过是说:如果您想从类型为X的变量中获取bar,只需将foo length of int的长度添加到基指针

在Javascript中,我们甚至没有这样的类型。我们可以说:

var x = {
    foo: 1,
    bar: 2
}
bar的查找将自动成为一个指针,我们称之为javascript查找中的引用。因为javascript没有类型,所以可以将对象视为带有指向混合类型指针的映射/字典

如果出于任何原因希望创建数据结构的副本,则必须递归地遍历整个数据结构,并手动创建数据结构的副本。基本类型不是基于指针的。其中包括数字Javascript自动区分整型和浮点型、字符串和布尔型

问题更新后编辑 虽然我不是这方面的专家,但我认为这是不可能的。问题是,底层数据的表示方式(如数据在内存中如何表示为字节)不同,因为javascript没有关于数据结构的编译时信息。正如我之前所说,javascript没有类/结构,只有带有字段的对象,这些字段基本上可以作为映射/字典来实现

然而,有一些第三方图书馆可以解决这些问题。一般有两种方法:

将所有内容解压缩到javascript对象。数据将被复制,但您可以将其作为普通javascript对象使用。如果您密集地读/写数据,则应该使用此选项,因为使用普通javascript对象时获得的性能提升超过了不必解包数据的优势。 将所有数据保留在缓冲区中。当您需要一些数据时,在运行时计算数据在缓冲区中的位置,并在该位置进行相应的读/写。因为struct数据位置计算是在运行时完成的,所以只有当您有数据负载并且只有少量读/写数据时才应该使用它。在这种情况下,解包所有数据的性能下降超过了必须完成的少量运行时计算。
作为补充说明,如果您需要处理的数据量没有那么多,我建议您将数据解包。它为您省去了使用库作为数据接口的麻烦。现在计算机的速度足够快,可以在内存中复制/处理一定数量的数据。此外,这些第三方库只是一些示例。我建议你对图书馆做更多的研究,以决定哪一个适合你的需要

但是如果我已经有了缓冲区,我如何映射结构呢?我从NodeJs分配了缓冲区,并在NodeFFI回调中对其进行了更改。我想快速访问不同的元素,而不必每次都写readUInt32LE。我要改变我的问题。如果你做了var x,那么保存x的缓冲区/内存区域将被分配,不像你映射到缓冲区的x指针。只分配地址大小。我不确定您想要完成什么。为什么要创建缓冲区?为什么不使用“普通”javascript对象和数组?你能提供一些背景吗?我以前从未使用过javascript缓冲区,或者必须使用过javascript缓冲区,因此您可能完全是从C背景使用它们,而实际上并不需要它们。