Добрый день.
Как перевести структуру (последовательно поля) в набор байтов, в C++ unmanaged это было просто, разумеется. А имеется ли подобная возможность грамотно делать это в C#? На сегодняшний день я добавляю к таким структурам метод byte[] GetBytes(), который реализую самостоятельно. Аттрибут StructLayout нужен для marshaling и здесь, похоже, мне не поможет.
Заранее благодарен.
Здравствуйте, Time, Вы писали:
T>Добрый день. T>Как перевести структуру (последовательно поля) в набор байтов, в C++ unmanaged это было просто, разумеется. А имеется ли подобная возможность грамотно делать это в C#? На сегодняшний день я добавляю к таким структурам метод byte[] GetBytes(), который реализую самостоятельно. Аттрибут StructLayout нужен для marshaling и здесь, похоже, мне не поможет. T>Заранее благодарен.
T>Как перевести структуру (последовательно поля) в набор байтов T>На сегодняшний день я добавляю к таким структурам метод byte[] GetBytes(), который реализую самостоятельно.
Можно так:
public static byte[] RawSerialize<T>(T anything) where T : struct {
int rawsize = Marshal.SizeOf(anything);
byte[] rawdata = new byte[rawsize];
GCHandle handle = GCHandle.Alloc(rawdata, GCHandleType.Pinned);
Marshal.StructureToPtr(anything, handle.AddrOfPinnedObject(), false);
handle.Free();
return rawdata;
}
И обратно:
public static T RawDeserialize<T>(byte[] raw) where T : struct {
GCHandle handle = GCHandle.Alloc(raw, GCHandleType.Pinned);
T result = (T)Marshal.PtrToStructure(
handle.AddrOfPinnedObject(), typeof(T));
handle.Free();
return result;
}
Здравствуйте, Nikolkos, Вы писали:
N>Здравствуйте, Time, Вы писали:
T>>Как быть когда структура содержит в себе String? Особенно если его надо преобразовать в набор Ansi байтов с длинной в начале.
N>Наверное, тогда маршаллеру необходимо указать размер.
N>