SORU
5 AĞUSTOS 2008, Salı


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
5 AĞUSTOS 2008, Salı


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;
}

...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jaclyn W

    Jaclyn W

    5 Mayıs 2006
  • The Slow Mo Guys

    The Slow Mo

    15 AĞUSTOS 2010
  • thenewboston

    thenewboston

    4 ŞUBAT 2008