如何在Node.js中解压缩c#packed结构

时间:2018-05-17 15:11:54

标签: c# c++ node.js buffer

我们使用cpp编写的私有源库和C#中的绑定使用这样的结构来将cpp库中的数据转换为c#结构,但问题是我不知道如何解压缩Nodej.js中的CPP Marshalled缓冲区:

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;
}

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

使用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,您可以编写一个帮助方法,该方法将解析并返回结构数据的副本:

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

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

  this._setBuff(oldBuff);

  return v;
};