2016-01-02 30 views
0

我有,而将这些结构的字节数组问题:无法转换结构中的字节数组C#

[StructLayout(LayoutKind.Sequential)] 
/// <summary> 
/// Packet structure, type 1 (SEND) 
/// </summary> 
internal struct PACKET_SEND 
{ 
    /// <summary> 
    /// Packet Type: 0 for notifications, 1 for status, 2 for login and auth. 
    /// </summary> 
    public Byte Type; 
    /// <summary> 
    /// Packet Key: select it from Packets class. 
    /// </summary> 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 61)] 
    public char[] Key; 
    /// <summary> 
    /// Account Name. 
    /// </summary> 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] 
    public char[] AccountName; 
    /// <summary> 
    /// Account Status: 0 for offline, 1 for online, 2 for absent, 3 for busy, 4 for invisible. 
    /// </summary> 
    public Byte Status; 
} 

[StructLayout(LayoutKind.Sequential)] 
/// <summary> 
/// Packet structure, type 2 (RECV) 
/// </summary> 
internal struct PACKET_RECV 
{ 
    /// <summary> 
    /// Packet Type: 0 for notifications, 1 for status, 2 for login and auth. 
    /// </summary> 
    public Byte Type; 
    /// <summary> 
    /// Packet Key: select it from Packets class. 
    /// </summary> 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 61)] 
    public char[] Key; 
    /// <summary> 
    /// Account Name. 
    /// </summary> 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)] 
    public char[] AccountName; 
} 

使用这些功能:

public static T ByteArrayToStructure<T>(byte[] data) where T : struct 
    { 
     GCHandle handle = GCHandle.Alloc(data, GCHandleType.Pinned); 
     T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), 
      typeof(T)); 
     handle.Free(); 
     return stuff; 
    } 

    public static byte[] StructToByteArray(object structure) 
    { 
     byte[] buffer = new byte[Marshal.SizeOf(structure)]; 
     GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); 
     Marshal.StructureToPtr(structure, handle.AddrOfPinnedObject(), false);//HERE GETS EXCEPTION 
     handle.Free(); 
     return buffer; 
    } 

我收到异常而使用“StructToByteArray”方法:

Type could not be marshaled because the length of an embedded array instance does not match the declared length in the layout. 

想法?请不要只发布解决方案,但解释会更加赞赏:D。 问候。

+0

当然,你做对了吗?我做了一个快速测试,它为我工作。你能展示更多的代码吗?顺便说一句,我的原代码没有显示此(http://stackoverflow.com/questions/8704161/c-sharp-array-within-a-struct/8704505#8704505),但我建议将'元帅'调用包装到'尝试...终于'。 –

回答

0

看看...

Error : Type could not be marshaled because the length of an embedded array instance does not match the declared length in the layout

......还有......

Error on size of class

...也许你不初始化数组字段 “钥匙” &“ AccountName“或者你没有正确初始化它们。值总是必须是61和30个字符。

+0

尝试一下。我确定密钥是**总是** 61个字符长度,但AccountName是可变的。所以要“填补”并尝试。 – Ciavi

+0

@Ciavi你是否尝试单独转换数组?因为这不应该工作,转换孔结构正在工作。 –