c# - 在 C# 中将结构转换为 byte[]

标签 c# struct type-conversion

我在一个类中有这个结构:

[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, Pack = 1)]
public struct MyStruct
{
    public byte StartOfText;
    public byte DisableChecksum;
    public byte ProtocolVersion;
    public byte Code;
    public Int16 Size;
    public byte[] Data;
    public byte EndOfText;

    public MyStruct(CommandCode commandCode, string commandData)
    {
        this.StartOfText = 0x02;
        this.DisableChecksum = 0x00;
        this.ProtocolVersion = 0x35;
        this.Code = (byte)commandCode;
        this.Size = (Int16)commandData.Length;
        this.Data = new byte[commandData.Length];
        this.Data = Encoding.ASCII.GetBytes(commandData);
        this.EndOfText = 0x03;
    }

    public byte[] ToByteArray()
    {
        byte[] arr = null;
        IntPtr ptr = IntPtr.Zero;
        try
        {
            Int16 size = (Int16)Marshal.SizeOf(this);
            arr = new byte[size];
            ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(this, ptr, true);
            Marshal.Copy(ptr, arr, 0, size);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
        finally
        {
            Marshal.FreeHGlobal(ptr);
        }

        return arr;
    }
}

现在,假设我在我的程序中初始化该结构的一个新实例,执行以下操作:

Protocol.MyStruct Cmd = new Protocol.MyStruct(CommandCode.LOAD_FILE, "TEST");
byte[] StructData = Cmd.ToByteArray();

初始化后,我可以看到 MyStruct.Data 正在使用字符串常量 (0x54、0x45、0x53、0x54) 的内容正确初始化。每个字符

但是当调用 MyStruct.TiByteArray() 并且我跟踪数组中的值时,数据部分现在是(0xa0、0xa6、0x91 和 0x03)。

数组的其余部分没问题,数据复制正确。

代码有什么问题或我错过了什么?

最佳答案

这在某些情况下可能有效。但是,Data 的长度是固定的。如果将 Data 定义为字符串,可能会更有用。

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MyStruct
{
    const int ARRAY_SIZE = 100;

    public byte StartOfText;
    public byte DisableChecksum;
    public byte ProtocolVersion;
    public byte Code;
    public Int16 Size;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = ARRAY_SIZE)]
    public byte[] Data;
    public byte EndOfText;

    public MyStruct(CommandCode commandCode, string commandData)
    {
        this.StartOfText = 0x02;
        this.DisableChecksum = 0x00;
        this.ProtocolVersion = 0x35;
        this.Code = (byte)commandCode;
        this.Size = (Int16)commandData.Length;
        this.Data = new byte[ARRAY_SIZE];
        byte[] bytes = Encoding.ASCII.GetBytes(commandData);
        Array.Copy(bytes, Data, bytes.Length);
        //this.Data = Encoding.ASCII.GetBytes(commandData);
        this.EndOfText = 0x03;
    }

    public byte[] ToByteArray()
    {
        byte[] arr = null;
        IntPtr ptr = IntPtr.Zero;
        try
        {
            int size = Marshal.SizeOf(this);
            arr = new byte[size];
            ptr = Marshal.AllocHGlobal(size);
            Marshal.StructureToPtr(this, ptr, true);
            Marshal.Copy(ptr, arr, 0, size);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
        finally
        {
            Marshal.FreeHGlobal(ptr);
        }

        return arr;
    }
}

关于c# - 在 C# 中将结构转换为 byte[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18665562/

相关文章:

c - 大数、求和和数据转换

c# - 使用 .NET 填充 html 列表控件

c# - 使用存储过程的 Entity Framework 并发问题

c# - 如何在 c# 请求后更改 json 格式?

c - 为什么不对 C 中的结构使用 typedef?

c++ - SSE:从 const __m128 * 转换为 const float *

c# - 在 C# 中获取视频剪辑的帧率

C++ - 队列中的最小值

c# - C#中的值类型类定义?

c++ - 将std::basic_string <Char>转换为字符串