【问题标题】:What is the equivalent of Python's struct.pack(fmt, v1, v2, ...) in C# .NET?C# .NET 中 Python 的 struct.pack(fmt, v1, v2, ...) 的等价物是什么?
【发布时间】:2013-09-18 08:58:02
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# python c struct pack


    【解决方案1】:

    您可以将字段一个接一个地写入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.当您 p/调用本机代码时,有 Interop Marshaling。但你不是 p/invoking 本机代码。

    【讨论】:

    • 经过测试,我能够成功地使用 Python 的 unpack(format, data) 来解压我的 C# 结构。所以我使用了BinaryWriterMemoryStreamMemoryStream.ToArray()
    【解决方案2】:

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

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

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

    【讨论】:

    • BinaryFormatter 肯定会将对象序列化为字节,但不会序列化为在 Python 中易于反序列化的格式。
    • 哦,我应该更仔细地阅读。我没有注意到他想用 Python 解压它。
    猜你喜欢
    • 2013-10-20
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2019-04-02
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多