Как упорядочить структуру в массиве UInt16 - PullRequest
1 голос
/ 14 июля 2010

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

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?
}

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

Небезопасный и безопасный способ сделать это:

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;
    }

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

1 голос
/ 14 июля 2010

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

...