C# c+的正确编组+;c中的结构# 我在C++中有这个结构,我需要转换成C,所以我可以从字节[] ]/P>创建这个结构。 struct TRANS_RECORD_DATA { int size, code; int ThrowItemCount; int ItemCount; int ItemSubStart; int DataSize; BYTE Data[sizeof(sRECORD_ITEM) * 200]; // sizeof(sRECORD_ITEM) = 548 };

C# c+的正确编组+;c中的结构# 我在C++中有这个结构,我需要转换成C,所以我可以从字节[] ]/P>创建这个结构。 struct TRANS_RECORD_DATA { int size, code; int ThrowItemCount; int ItemCount; int ItemSubStart; int DataSize; BYTE Data[sizeof(sRECORD_ITEM) * 200]; // sizeof(sRECORD_ITEM) = 548 };,c#,c++,marshalling,C#,C++,Marshalling,C版本: 我使用此通用函数从字节数组中获取结构: T ByteArrayToStructure<T>(byte[] bytes) where T : struct { GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned); T stuff = (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof (T)); handle.

C版本:

我使用此通用函数从字节数组中获取结构:

T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
    GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
    T stuff = (T) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof (T));
    handle.Free();
    return stuff;
}
应该返回一个
TRANS\u RECORD\u DATA
,其中包含所有值为0的int成员,最后该
byte[]DATA
将只包含剩余的两个字节。(26 - 24 = 2). 但它似乎总是试图创建完整的548*200字节[],然后导致访问冲突


有什么方法可以解决这个问题吗?

因此,在您解释它时,不管数据数组的C定义是200*548字节长,它实际上并不是完全由您调用的外部非托管代码分配或填充的

这样,您唯一的解决方法是不在C#结构定义中定义数据:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct TRANS_RECORD_DATA {
    public int size, code;
    public int ThrowItemCount;
    public int ItemCount;
    public int ItemSubStart;
    public int DataSize;
};
读取数据大小后,将字节数组的其余部分重新解释为该数据结构

您仍然可以使用对Marshal.PtrToStructure的一系列调用:

GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
TRANS_RECORD_DATA  stuff = (TRANS_RECORD_DATA) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof (TRANS_RECORD_DATA));
var items = new List<sRECORD_ITEM>(stuff.ItemCount);
for (int i = 0; i < stuff.ItemCount; ++i)
{
    var ptr = handle.AddrOfPinnedObject().Add(i*548)
    sRECORD_ITEM item = (sRECORD_ITEM)Marshal.PtrToStructure(ptr,typeof(sRECORD_ITEM));
}
GCHandle=GCHandle.Alloc(字节,GCHandleType.pinted);
TRANS_RECORD_DATA stuff=(TRANS_RECORD_DATA)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(TRANS_RECORD_DATA));
var items=新列表(stuff.ItemCount);
对于(int i=0;i

我很确定这会起作用。

因此,正如您所解释的,不管数据数组的C定义是200*548字节长,它实际上并不是完全由您调用的外部非托管代码分配或填充的

这样,您唯一的解决方法是不在C#结构定义中定义数据:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct TRANS_RECORD_DATA {
    public int size, code;
    public int ThrowItemCount;
    public int ItemCount;
    public int ItemSubStart;
    public int DataSize;
};
读取数据大小后,将字节数组的其余部分重新解释为该数据结构

您仍然可以使用对Marshal.PtrToStructure的一系列调用:

GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
TRANS_RECORD_DATA  stuff = (TRANS_RECORD_DATA) Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof (TRANS_RECORD_DATA));
var items = new List<sRECORD_ITEM>(stuff.ItemCount);
for (int i = 0; i < stuff.ItemCount; ++i)
{
    var ptr = handle.AddrOfPinnedObject().Add(i*548)
    sRECORD_ITEM item = (sRECORD_ITEM)Marshal.PtrToStructure(ptr,typeof(sRECORD_ITEM));
}
GCHandle=GCHandle.Alloc(字节,GCHandleType.pinted);
TRANS_RECORD_DATA stuff=(TRANS_RECORD_DATA)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),typeof(TRANS_RECORD_DATA));
var items=新列表(stuff.ItemCount);
对于(int i=0;i

我很肯定这会奏效。

当然不行。只需声明不带数据元素的结构。您可以直接从bytes[]参数访问数据。它从索引24开始,当然不行。只需声明不带数据元素的结构。您可以直接从bytes[]参数访问数据。它从索引24开始。好吧,不是我预期的,但它做到了。我希望能找到一种方法来实现这一点,但仍然在结构中声明字节[]。谢谢。嗯,不是我所期望的,但它成功了。我希望能找到一种方法来实现这一点,但仍然在结构中声明字节[]。非常感谢。