Вы можете использовать unsafe
для доступа к любым типам баптированных (массивов, строк, структур и т. Д.) В качестве указателя байтов.
Локальные переменные типов значений не должны быть прикреплены:
public unsafe void ReadAsBytePointer(MyStruct obj)
{
byte* ptr = (byte*)&obj;
...
}
Массивы должны быть прикреплены. Самым простым решением является использование фиксированной:
public unsafe void ReadAsBytePointer(MyStruct[] input)
{
fixed(MyStruct* ptr = input)
{
byte* byteArray = (byte*)ptr;
}
}
Для общего случая без добавления unsafe
в свой код, который вы можете использовать GCHandle:
static byte[] GetBytes<T>(T input)
where T : struct
{
int size = Marshal.SizeOf(typeof(T));
byte[] result = new byte[size];
GCHandle gc = GCHandle.Alloc(input, GCHandleType.Pinned);
try
{
Marshal.Copy(gc.AddrOfPinnedObject(), result, 0, size);
}
finally
{
gc.Free();
}
return result;
}
Сериализация с использованием двоичного форматера? И десериализовать назад? – nawfal
Нет, вам придется использовать BitConverter-Methods. Но я бы предложил написать C-библиотеку для того, что легче конвертировать потоки байтов в структуры. На самом деле это просто логика указателя. – PhilMasterG
Попробуйте следующее: http://stackoverflow.com/questions/2871/reading-a-c-c-data-structure-in-c-sharp-from-a-byte-array – CKII