문제

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