Как мне упорядочить массив байтов в структуре? - PullRequest
0 голосов
/ 21 июля 2009

Схожий вопрос

В связанном вопросе я пытался найти самый быстрый способ. Метод, который я выбрал в этом вопросе, стал для меня узким местом. Я читаю некоторые двоичные данные из файла, и мне нужно поместить их в определение управляемой структуры. Не используется неуправляемый код, поэтому я думаю, что есть лучший способ, чем выделение GCHandle.

Есть ли способ просто привести массив байтов к структуре того же размера?

Ответы [ 2 ]

0 голосов
/ 21 июля 2009

Вы можете проверить такой код:


struct Foo
{
  public int x;
}

public unsafe static void Main()
{
  byte[] x = new byte[] { 1, 1, 0, 0 };
  Foo f;

  fixed (byte* xPtr = x)
  {
    f = *((Fpp*)xPtr);
  }

  Console.WriteLine(f.x);
}

Это определенно очень небезопасно, и у вас могут возникнуть проблемы, если структура содержит более сложные типы.

0 голосов
/ 21 июля 2009

У меня есть такой метод:

static public T ReadStructure<T>(byte[] bytes)
    where T : struct
{
    int len = Marshal.SizeOf(typeof(T));
    IntPtr i = Marshal.AllocHGlobal(len);

    try
    {
        Marshal.Copy(bytes, 0, i, len);
        return (T)Marshal.PtrToStructure(i, typeof(T));
    }
    finally
    {
        Marshal.FreeHGlobal(i);
    }
}

По общему признанию, это не очень быстро - но это не должно быть, в моем случае. Это ваше текущее решение, и вы обнаружили, что издержки на выделение / копирование / выпуск слишком медленные?

...