質問

What is the equivalent of Python's struct.pack(fmt, v1, v2, ...) in C# .NET? I have the following struct defined in C#

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

And would like to unpack it in Python application by using struct.unpack('<ci',myStringedStruct)

I was planing to use BinaryWriter into MemoryStream as suggested by Jon Skeet. However, BinaryWriter only write primitive types, and I have a struct.

役に立ちましたか?

解決

You can write the fields one after another to the BinaryWriter:

User user = ...

using (BinaryWriter writer = ...)
{
    writer.Write((byte)user.id);
    writer.Write(user.age);
}
  • BinaryWriter uses the endianness of the platform, i.e., little endian on x86/x64.
  • "c – char – string of length 1 – 1 byte" is a byte in C#. Write(byte)
  • "i – int – integer – 4 bytes" is an int in C#. Write(Int32)

There is no pack/unpack-like functionality built into the .NET Framework.1

1. When you're p/invoking native code, there's Interop Marshaling. But you're not p/invoking native code.

他のヒント

You can also use the BinaryFormatter class to serialize entire hierarchies of objects, or just a simple struct. You may have to do it manually (byte-by-byte) or use a non-binary format, such as XML to make it platform and language independent, however.

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

EDIT: I didn't notice the request to later unpack it using Python. This is unlikely to work with Python's unpack function. In general, I would be hesitant to use library calls to write data in binary formats for use in different applications written with different libraries. There's no guarantee of consistency, and specifications may change in the future. You're better off using a language-independent standard.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top