Вам лучше не беспокоиться о том, чтобы заставить вашу структуру пакетов храниться в виде байтового массива. Стоимость процессора для преобразования в и из байтового массива, а также стоимость памяти для временного дублированного хранилища, скорее всего, незначительны. Создайте класс или набор классов для представления вашей структуры данных, а затем используйте BinaryWriter
для преобразования его в байтовый массив в формате, требуемом вашим протоколом.
Если вы действительно хотите использовать структуру, изучите метод Marshal.StructureToPtr
и атрибуты [LayoutKind]
и [MarshalAs]
. Но имейте в виду, что если ваша структура данных содержит поля переменной длины (строки или массивы), вы не сможете преобразовать ее в байтовый массив с помощью этого метода. И я не вижу причин, почему вы должны идти по этому пути. Он действительно предназначен для взаимодействия с Win32.
EDIT:
Еще одна мысль: если вы застряли с большим байтовым массивом и действительно хотите получить доступ к его фрагментам по имени, я бы создал реализацию IList<T>
, которая взяла бы T[]
смещение и длину просто использовал массив в качестве хранилища. Тогда вы можете создать класс так:
public class Packet
{
public byte[] PacketData;
public SubArray<byte> Header;
public SubArray<byte> MessageBody;
// Add more SubArrays for each of the remainder of your 8 packet pieces
//modify this constructor as needed
public Packet(byte[] data)
{
// replace the offsets and lengths here with appropriate data
Header = new SubArray<byte>(data, 0, 10);
MessageBody = new SubArray<byte>(data, 10, 100);
}
}
public class SubArray<T> : IList<T>
{
private T[] data;
private int offset;
private int length;
public SubArray(T[] data, int offset, int length)
{
this.data = data;
this.offset = offset;
this.length = length;
}
public T this[int i]
{
get
{
if (i < 0 || i >= length) throw new ArgumentOutOfRangeException();
return data[i + offset];
}
set
{
if (i < 0 || i >= length) throw new ArgumentOutOfRangeException();
data[i + offset] = value;
}
}
// TODO: Implement the rest of IList<T> accordingly
}