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++中有这个结构,我需要转换成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.
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开始。好吧,不是我预期的,但它做到了。我希望能找到一种方法来实现这一点,但仍然在结构中声明字节[]。谢谢。嗯,不是我所期望的,但它成功了。我希望能找到一种方法来实现这一点,但仍然在结构中声明字节[]。非常感谢。