У меня есть эта структура на C++, которую мне нужно преобразовать в C#, поэтому я могу создать эту структуру из байта [].правильная сортировка структуры C++ в C#
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# версия:
[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;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 548*200)]
public byte[] Data;
};
Я использую эту обобщенную функцию, чтобы дать мне структуру из массива байтов:
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;
}
Но это дает мне:
AccessViolation Exception.
Я верю, что знаю, почему, но я не знаю, как его решить. byte[]
У меня есть, который должен быть отображен в структуру, не всегда имеет элемент Data
размером 548 * 200. Это число является максимальным. Но кажется, что этот GenericMethod, который я использую, всегда пытаюсь создать структуру с этим Data всегда 548 * 200, а затем он, очевидно, бросит AccessViolation, потому что данные, которые будут отображаться, уже закончены.
Например, этот код:
var bytes = new byte[26];
var structure = ByteArrayToStructure<TRANS_RECORD_DATA>(bytes);
Если вернуть TRANS_RECORD_DATA
со всеми теми, ИНТ пользователей с 0 значением, и, наконец, что byte[] Data
бы только оставшиеся два байта. (26 - 24 = 2). Но кажется, что он пытается создать полный байт 548 * 200 [] все время, а затем вызывает нарушение доступа.
Есть ли способ решить эту проблему?
Это не может работать, конечно. Просто объявите struct * без * элемента Data. Вы можете получить доступ к данным непосредственно из аргумента * bytes [] *. Он начинается с индекса 24. –