如何使用指针映射C语言缓冲区中的结构并进行转换

时间:2017-10-30 11:46:03

标签: node.js

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

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

NodeJs有可能吗?我能怎么做 ?我怎样才能确定它是映射而不是creating a new object and copy information inside

示例:

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.

这是错误的,但很好地解释了我在寻找什么。 这没有复制任何东西。

如果我MyHouse.door=56mybuff包含了解56.我认为mybuff是指针。

1 个答案:

答案 0 :(得分:1)

在下面的问题更新后编辑

与C / C ++相反,javascript默认使用pionters,因此您无需执行任何操作。实际上是另一种方式:如果你想要当前对象的副本,你必须付出一些努力。

在C中,struct只不过是对struct中不同数据部分的编译时引用。所以:

struct X {
    int foo;
    int bar;
}

只不过是说:如果你想从类型为X的变量中选择bar,只需将foo的长度(int的长度)添加到基指针即可。

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

var x = {
    foo: 1,
    bar: 2
}

bar的查找将自动成为指针(我们称之为javascript中的引用)查找。因为javascript没有类型,所以可以将对象视为具有指向混合类型的指针的地图/字典。

如果您出于任何原因想要创建数据结构的副本,则必须遍历整个数据结构(递归地)并手动创建数据结构的副本。基本类型不是基于指针的。这些包括数字(Javascript自动区分int和float),字符串和布尔值。

问题更新后编辑

虽然我不是这方面的专家,但我认为不可能。问题是,底层数据表示(如数据如何表示为内存中的字节)是不同的,因为javascript没有关于数据结构的编译时信息。正如我之前所说,javascript没有类/结构,只有具有字段的对象,它们基本上表现为(并且可以实现为)地图/字典。

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

  1. 将所有内容解压缩到javascript对象。数据将被复制,但您可以将其作为普通的javascript对象使用。如果您集中读取/写入数据,则应该使用此方法,因为使用普通javascript对象时获得的性能提升超过了不必解压缩数据的优势。 Link to example library
  2. 将所有数据保留在缓冲区中。当您需要某些数据时,请计算缓冲区在运行时中的数据位置,并相应地在此位置读/写。因为struct数据位置计算是在运行时完成的,所以只有当你有大量数据并且只有少量读/写时才应该使用它。在这种情况下,解包所有数据的性能降低超过了必须完成的少量运行时计算。 Link to example library
  3. 作为旁注,如果您需要处理的数据量不是那么多,我建议您只需解压缩数据。它使您不必担心必须使用库作为数据的接口。现在,计算机足够快,可以在内存中复制/处理一些数据。此外,这些第三方库只是一些例子。我建议你为图书馆做一些研究,以决定哪一个适合你的需求。