如何在python中将字节数组反序列化为结构?

2024-09-27 23:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个C代码:

结构:

[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi, Size = 116)]
    public struct pLogin
    {
        public pHeader _header;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
        public string senha;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
        public string login;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] unk1;
        public int algo1;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 42)]
        public byte[] unk2;
        public short algo2;
        //versao do cliente
        public ushort cliver;
        public ushort unk3;
        public int umBool;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
        public byte[] mac;
    }
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi, Size = 12)]
    public struct pHeader
    {
        public ushort size;
        public byte key;
        public byte checksum;
        public ushort packetId;
        public ushort clientId;
        public uint timestamp;
    }

登录功能:

^{pr2}$

现在缓冲区转换器类:

public static Byte[] StructureToBuffer<T>(T structure)
    {
        Byte[] buffer = new Byte[Marshal.SizeOf(typeof(T))];

        unsafe
        {
            fixed (byte* pBuffer = buffer)
            {
                Marshal.StructureToPtr(structure, new IntPtr((void*)pBuffer), true);
            }
        }

        return buffer;
    }

    public static T BufferToStructure<T>(Byte[] buffer, Int32 offset)
    {
        unsafe
        {
            fixed (Byte* pBuffer = buffer)
            {
                return (T)Marshal.PtrToStructure(new IntPtr((void*)&pBuffer[offset]), typeof(T));
            }
        }
    }

代码abocve从一个结构创建一个带有登录数据的字节数组。 有没有一种方法可以在python中序列化/反序列化缓冲区数组?- 我不知道如何在python中实现它,因为我没有看到很多关于字节数组的文章。在


Tags: 代码newbuffer数组bytepublicmarshalcharset
1条回答
网友
1楼 · 发布于 2024-09-27 23:28:12

当然有几种方法。在

有一个built-in ^{} module,它需要一些手动工作来计算出结构的格式字符串。在

您还可以使用更高级的第三方库,如^{}(我可以推荐)。在

使用Construct,您的结构可能看起来像

Header = Struct(
    'size' / Int16ub,
    'key' / Int8ub,
    'checksum' / Int8ub,
    'packetId' / Int16ub,
    'clientId' / Int16ub,
    'timestamp' / Int32ub,
)
Login = Struct(
    "header" / Header,
    # ...
)

–一个相当直接的C原稿翻译,并提供一个数据缓冲区,然后您可以做如下事情

^{pr2}$

相关问题 更多 >

    热门问题