Вот один из способов сделать это:
struct SERVICE
{
public byte c;
public byte size;
public byte headcode;
public byte Type;
public ushort Port;
public string ServiceName;
public ushort ServiceCode;
};
string GetNullTerminatedString(byte[] data, Encoding encoding)
{
int index = Array.IndexOf(data, (byte)0);
if (index < 0)
{
Debug.WriteLine("No string terminator found.");
index = data.Length;
}
return encoding.GetString(data, 0, index);
}
SERVICE ByteArrayToService(byte[] array, Encoding encoding)
{
using (MemoryStream stream = new MemoryStream(array))
{
using (BinaryReader reader = new BinaryReader(stream))
{
SERVICE service = new SERVICE();
service.c = reader.ReadByte();
service.size = reader.ReadByte();
service.headcode = reader.ReadByte();
service.Type = reader.ReadByte();
service.Port = reader.ReadUInt16();
service.ServiceName = GetNullTerminatedString(reader.ReadBytes(50), encoding);
service.ServiceCode = reader.ReadUInt16();
return service;
}
}
}
void Main(string[] args)
{
byte[] data = new Byte[]
{
0xC1, 0x3A, 0x00, 0x01, 0x5D, 0xDA, 0x47, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xF0, 0xFC, 0x12, 0x00, 0x00, 0x00
};
SERVICE s = ByteArrayToService(data, Encoding.Default);
}
Предполагается, что двоичный массив использует тот же Endianess, что и ваша архитектура.Если это не так, вы можете использовать EndianBinaryReader из библиотеки MiscUtil .
Редактировать: это также хорошее решение, которое полностью избегает читателя.Однако нельзя напрямую указать кодировку, используемую для строки, и структура памяти структуры должна соответствовать структуре, используемой в байтовом массиве.
[StructLayout(LayoutKind.Sequential)]
struct SERVICE
{
public byte c;
public byte size;
public byte headcode;
public byte Type;
public ushort Port;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string ServiceName;
public ushort ServiceCode;
};
SERVICE ByteArrayToService(byte[] array)
{
GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned);
SERVICE service = (SERVICE)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(SERVICE));
handle.Free();
return service;
}