2015-08-24 5 views
-8

Я читаю следующие некоторые. Может ли кто-то пролить некоторый свет на это, вероятно, с примеромпреобразование структуры в массив байтов

'сообщение может быть даже структурой, которая просто преобразуется в массив байтов, который выводится на отладочном UART.

Затем на стороне ПК входящий массив байтов может быть легко преобразован обратно в объект типа struct. '

+1

Сериализация с использованием двоичного форматера? И десериализовать назад? – nawfal

+0

Нет, вам придется использовать BitConverter-Methods. Но я бы предложил написать C-библиотеку для того, что легче конвертировать потоки байтов в структуры. На самом деле это просто логика указателя. – PhilMasterG

+0

Попробуйте следующее: http://stackoverflow.com/questions/2871/reading-a-c-c-data-structure-in-c-sharp-from-a-byte-array – CKII

ответ

1

Вы можете использовать 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; 
}