Вы можете попробовать сортировочных:
Объявить макет вашего класса как Sequential (и обратите внимание, что вам нужно будет использовать Pack = 1
):
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class Data
{
public int _int1;
public int _int2;
public short _short1;
public long _long1;
}
Маршал байты в новый экземпляр класса данных:
var bytes = new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0 };
GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var data = (Data)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
gcHandle.Free();
// Now data should contain the correct values.
Console.WriteLine(data._int1); // Prints 1
Console.WriteLine(data._int2); // Prints 2
Console.WriteLine(data._short1); // Prints 3
Console.WriteLine(data._long1); // Prints 4
Для удобства вы можете написать статический метод данных для выполнения преобразования:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class Data
{
public int _int1;
public int _int2;
public short _short1;
public long _long1;
public static Data FromBytes(byte[] bytes)
{
GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var data = (Data)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
gcHandle.Free();
return data;
}
}
...
var data = Data.FromBytes(new byte[] {1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0});
Если вы действительно хотели, чтобы вы могли написать явный оператор для преобразования из массива байтов, чтобы получить синтаксис в вашем OP. Я бы предложил просто использовать Data.FromBytes()
, который будет намного понятнее ИМО.
Тем не менее, только для полноты:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
class Data
{
public int _int1;
public int _int2;
public short _short1;
public long _long1;
public static explicit operator Data(byte[] bytes)
{
GCHandle gcHandle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
var data = (Data)Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof(Data));
gcHandle.Free();
return data;
}
}
...
var data = (Data)new byte[] {1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0};
Что вы хотите достичь? Должен быть какой-то логин в отношении между вашими байтами и экземпляром, который вы хотите создать. –
Технически вы можете реализовать оператор * *, т. Е. Публичный статический явный оператор Data (Byte [] source) {...} 'но * сериализация * - гораздо лучшее решение. –
Получить представление - [См. Здесь] (http://www.morgantechspace.com/2013/08/convert-object-to-byte-array-and-vice.html) – pedram