C# .NET 中的 Python struct.pack(fmt, v1, v2, ...) 相当于什么?


C

# .NET中Python的struct.pack(fmt,v1,v2,...)的等价物是什么?我在 C# 中定义了以下结构

[StructLayout(LayoutKind.Sequential, Pack=1)]
    struct user {
        public char id;
        public int age; 
    };

并希望使用struct.unpack('<ci',myStringedStruct)在 Python 应用程序中解压缩它

我计划按照Jon Skeet的建议将BinaryWriter用于MemoryStream。但是,BinaryWriter只写基元类型,我有一个结构。

您可以将字段一个接一个地写入 BinaryWriter:

User user = ...
using (BinaryWriter writer = ...)
{
    writer.Write((byte)user.id);
    writer.Write(user.age);
}
  • BinaryWriter使用平台的字节序,即x86/x64上的小端序。
  • "c – char – 长度为 1 – 1 字节的字符串"是 C# 中的一个字节。写入(字节)
  • "i – int – integer – 4 bytes"是 C# 中的一个 int。写入(Int32)

.NET Framework 中没有内置类似pack/unpack的功能。1

1. 当您 p/调用本机代码时,存在互操作封送处理。但是你不是在p/调用本机代码。

还可以使用 BinaryFormatter 类来序列化对象的整个层次结构,或者只是一个简单的结构。但是,您可能必须手动(逐字节)或使用非二进制格式(如 XML)来使其独立于平台和语言。

请参阅 http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx

编辑:我没有注意到稍后使用Python解压缩的请求。这不太可能与Python的解包功能一起使用。通常,我会犹豫是否使用库调用以二进制格式写入数据,以便在使用不同库编写的不同应用程序中使用。无法保证一致性,并且将来可能会更改规格。您最好使用与语言无关的标准。

最新更新