C C/C veri yapısı okuma# baytlık bir diziden
Bir bayt C# yapı doldurmak için en iyi yol olacağını[] verileri C/C bir yapı olduğu dizi? C yapı böyle bir şey (benim C çok paslı) görünecektir:
typedef OldStuff {
CHAR Name[8];
UInt32 User;
CHAR Location[8];
UInt32 TimeStamp;
UInt32 Sequence;
CHAR Tracking[16];
CHAR Filler[12];
}
Ve böyle bir şey dolduracak
[StructLayout(LayoutKind.Explicit, Size = 56, Pack = 1)]
public struct NewStuff
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(0)]
public string Name;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(8)]
public uint User;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
[FieldOffset(12)]
public string Location;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(20)]
public uint TimeStamp;
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(24)]
public uint Sequence;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
[FieldOffset(28)]
public string Tracking;
}
Eğer OldStuff
bayt olarak geçildi en iyi yolu NewStuff
OldStuff
kopyalama için[] dizi?
Şu anda aşağıdaki gibi bir şey yapıyorum, ama biraz gürültülü gibi geliyor.
GCHandle handle;
NewStuff MyStuff;
int BufferSize = Marshal.SizeOf(typeof(NewStuff));
byte[] buff = new byte[BufferSize];
Array.Copy(SomeByteArray, 0, buff, 0, BufferSize);
handle = GCHandle.Alloc(buff, GCHandleType.Pinned);
MyStuff = (NewStuff)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),
typeof(NewStuff));
handle.Free();
Bunu yapmanın daha iyi bir yolu var mı?
BinaryReader
sınıf sunuyoruz bellek iğneleme ve Marshal.PtrStructure
kullanarak herhangi bir performans artışı kullanarak ki?
CEVAP
Bu bağlamda gördüğüm kadarıyla, SomeByteArray belleğe kopyalamak için gerek yok. Sadece SomeByteArray kolu, pin, IntPtr verileri kullanarak PtrToStructure kopyalayın ve sonra bırakın almak gerekir. Bir kopyasını gerek.
Bu olabilir:
NewStuff ByteArrayToNewStuff(byte[] bytes)
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
NewStuff stuff = (NewStuff)Marshal.PtrToStructure(
handle.AddrOfPinnedObject(), typeof(NewStuff));
handle.Free();
return stuff;
}
Genel sürüm:
T ByteArrayToStructure<T>(byte[] bytes) where T: struct
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
T stuff = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(),
typeof(T));
handle.Free();
return stuff;
}
...
En iyi Anahtar Değeri için uygulama Ve...
Farklı bir istek veri okuma hatası...
Hileli zar için veri yapısı?...
Okuma Sonrası Veri ASP.Net Formu tesli...
Nasıl bellek mayın Tarlası mayın düzen...