如何在 Node.js 中解压一个 c# 打包的结构

How to unpack a c# packed struct in Node.js

我们使用一个用 cpp 编写的私有源库,在 C# 中使用一些类似这样的结构进行绑定,以便将 cpp 库中的数据转换为 c# 结构,但问题是我不知道如何解压Nodej.js 中的 CPP 编组缓冲区:

C# 中的结构体:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
unsafe public struct TheClass
{
    public byte XXX;
    public int XXX;
    public int XXX;
    public ushort XXX;
    public byte XXX;
    public byte XXX;
    public byte XXX;
    public byte XXX;
    public byte XXX;
    public byte XXX;
    public fixed byte XXX[12];
    public fixed byte XXX[5];
    public short XXX;
}

感谢您的帮助:)

使用 npm struct package:

const TheClass = Struct()
  .word8('XXX')
  .word32Sle('XXX')
  .word32Sle('XXX')
  .word16Ule('XXX')
  .word8('XXX')
  .word8('XXX')
  .word8('XXX')
  .word8('XXX')
  .word8('XXX')
  .word8('XXX')
  .array('XXX', 12, 'word8')
  .array('XXX', 5, 'word8')
  .word16Sle('XXX');

当然,将所有XXX替换为正确的字段名称。

然后你可以使用这个对象来解析一个Buffer对象的内容:

TheClass._setBuff(yourBuffer);

// Read the data for field XXX (using a valid name).
var someField = TheClass.get('XXX');

// Or use the proxy object:
var someOtherField = TheClass.fields.XXX;

使用 lodash 您可以编写一个辅助方法来解析和 return 结构数据的副本:

Struct.prototype.parse = function (buffer) {
  const oldBuff = this.buffer();

  this._setBuff(buffer);
  const v = _.cloneDeep(this.fields);

  this._setBuff(oldBuff);

  return v;
};