2010-07-13 2 views
1

Я знаю, что вы можете использовать такой код, чтобы выстроить структуру в массив байтов:Как мобилизовывать на структуру в массив UInt16

public static byte[] StructureToByteArray(object obj) 
{ 
    int len = Marshal.SizeOf(obj); 
    byte[] arr = new byte[len]; 
    IntPtr ptr = Marshal.AllocHGlobal(len); 
    Marshal.StructureToPtr(obj, ptr, true); 
    Marshal.Copy(ptr, arr, 0, len); 
    Marshal.FreeHGlobal(ptr); 
    return arr; 
} 

Но как выстроить структуру в массив, содержащий 16 бит слова вместо байтов?

public static UInt16[] StructureToUInt16Array(object obj) 
{ 
    // What to do? 
} 

ответ

1

Любая причина, чтобы не маршалировать в массив байтов, а затем использовать Buffer.BlockCopy? Я бы сказал, это был бы самый простой подход. По общему признанию, вам нужно сделать соответствующее копирование, поэтому оно менее эффективно, но я не думаю, что вы найдете гораздо более простой способ.

2

В связи с небезопасным и безопасный способ сделать это:

static UInt16[] MarshalUInt16(Object obj) 
    { 
     int len = Marshal.SizeOf(obj); 

     IntPtr ptr = Marshal.AllocHGlobal(len); 
     Marshal.StructureToPtr(obj, ptr, true); 

     UInt16[] arr = new UInt16[len/2]; 

     unsafe 
     { 
      UInt16* csharpPtr = (UInt16*)ptr; 

      for (Int32 i = 0; i < arr.Length; i++) 
      { 
       arr[i] = csharpPtr[i]; 
      } 
     } 

     Marshal.FreeHGlobal(ptr); 
     return arr; 
    } 

    static UInt16[] SafeMarshalUInt16(Object obj) 
    { 
     int len = Marshal.SizeOf(obj); 
     byte[] buf = new byte[len]; 
     IntPtr ptr = Marshal.AllocHGlobal(len); 
     Marshal.StructureToPtr(obj, ptr, true); 
     Marshal.Copy(ptr, buf, 0, len); 
     Marshal.FreeHGlobal(ptr); 

     UInt16[] arr = new UInt16[len/2]; 

     //for (Int32 i = 0; i < arr.Length; i++) 
     //{ 
     // arr[i] = BitConverter.ToUInt16(buf, i * 2); 
     //} 

     Buffer.BlockCopy(buf, 0, arr, 0, len); 

     return arr; 
    } 

Обновленный, чтобы отразить мудрость других.

Смежные вопросы