Другое решение состоит в создании ассоциативного массива с форматом даты и последующим переформатированием данных.
Этот метод полезен для даты, отформатированной беспорядочным способом.
Пример:
mydate='01.02.12 10:20:43':
myformat='dd/mm/yy HH:MM:ss';
dtsplit=mydate.split(/[\/ .:]/);
dfsplit=myformat.split(/[\/ .:]/);
// creates assoc array for date
df = new Array();
for(dc=0;dc<6;dc++) {
df[dfsplit[dc]]=dtsplit[dc];
}
// uses assc array for standard mysql format
dstring[r] = '20'+df['yy']+'-'+df['mm']+'-'+df['dd'];
dstring[r] += ' '+df['HH']+':'+df['MM']+':'+df['ss'];
Из того, что я вижу в том контексте, Вы не должны копировать SomeByteArray
в буфер. Просто необходимо получить дескриптор от SomeByteArray
, прикрепить его, скопировать IntPtr
данные с помощью PtrToStructure
и затем выпустить. Никакая потребность в копии.
, Который был бы:
NewStuff ByteArrayToNewStuff(byte[] bytes)
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
NewStuff stuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(NewStuff));
}
finally
{
handle.Free();
}
return stuff;
}
Универсальная версия:
T ByteArrayToStructure<T>(byte[] bytes) where T: struct
{
T stuff;
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
try
{
stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
}
finally
{
handle.Free();
}
return stuff;
}
Более простая версия (требует unsafe
переключатель):
unsafe T ByteArrayToStructure<T>(byte[] bytes) where T : struct
{
fixed (byte* ptr = &bytes[0])
{
return (T)Marshal.PtrToStructure((IntPtr)ptr, typeof(T));
}
}
Не упустите упаковку проблем. В примере Вы дали все поля, при очевидных смещениях, потому что все находится на 4-байтовых границах, но это будет не всегда иметь место. Visual C++ упаковывает на 8-байтовых границах по умолчанию.
Если у Вас есть байт [], необходимо быть в состоянии использовать класс BinaryReader и установленные значения на NewStuff с помощью доступных методов ReadX.