如何在 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;
}
感谢您的帮助:)
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;
};
我们使用一个用 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;
}
感谢您的帮助:)
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;
};