скажем, у меня есть коллекция байтов
var bytes = new byte[] {0, 1, 2, 3, 4, 5, 6, 7};
и я хочу извлечь определенное значение из байтов как управляемый тип, например ushort
. Какой простой способ определить, какие типы находятся в каком месте в коллекции, и извлечь эти значения?
Один (безобразный) способ - использовать System.BitConverter
и Queue
или byte[]
с индексом и просто выполнять итерацию, например ::
int index = 0;
ushort first = System.BitConverter.ToUint16(bytes, index);
index += 2; // size of a ushort
int second = System.BitConverter.ToInt32(bytes, index);
index += 4;
...
Этот метод становится очень, очень утомительным, когда вы имеете дело со многими из этих структур!
Я знаю, что есть System.Runtime.InteropServices.StructLayoutAttribute
, который позволяет мне определять расположение типов внутри структуры или класса, но, похоже, нет способа импортировать коллекцию байтов в эту структуру. Если бы я мог как-то наложить структуру на коллекцию байтов и вытащить значения, это было бы идеально. Э.Г.
Foo foo = (Foo)bytes; // doesn't work because I'd need to implement the implicit operator
ushort first = foo.first;
int second = foo.second;
...
[StructLayout(LayoutKind.Explicit, Size=FOO_SIZE)]
public struct Foo {
[FieldOffset(0)] public ushort first;
[FieldOffset(2)] public int second;
}
Есть мысли о том, как этого добиться?
[РЕДАКТИРОВАТЬ: См. Также мой вопрос о том, как обращаться с байтами, когда они старшего порядка .]