在C#.NET中Python的struct.pack(fmt,v1,v2,...)的等价物是什么?

时间:2013-09-17 23:36:36

标签: c# python c struct pack

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应用程序中解压缩它

我计划将BinaryWriter用作MemoryStream suggested by Jon Skeet。但是,BinaryWriter only write primitive types,我有一个结构。

2 个答案:

答案 0 :(得分:3)

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

User user = ...

using (BinaryWriter writer = ...)
{
    writer.Write((byte)user.id);
    writer.Write(user.age);
}
  • BinaryWriter使用平台的字节顺序,即x86 / x64上的小端。
  • “c - char - 长度为1 - 1字节的字符串”是C#中的byteWrite(byte)
  • “i - int - integer - 4 bytes”是C#中的intWrite(Int32)

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

1。当您调用本机代码时,有Interop Marshaling。但你不是在调用本机代码。

答案 1 :(得分:0)

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

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

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