簡體   English   中英

C#緩沖區的通用讀取/寫入方法

[英]C# Generic read/write methods for Buffer

我一直在嘗試編寫一個Buffer類,該類允許我使用通用方法對內部List緩沖區進行寫入和讀取。 在C ++中,這沒問題,因為我們可以直接訪問內存(memcpy(我知道memcpy是不安全的),依此類推)。

我嘗試了以下方法:

// private readonly List<byte> _buffer = new List<byte>();
public void Write<T>(T value) where T : byte, short, ushort, int, uint {
    _buffer.AddRange(BitConverter.GetBytes(value));
}

...但是它說,最好的重載有一些無效的參數(值)。

我在讀取字節,short,ushort,int或uint類型的值時也遇到問題。 我可以確定T的類型,然后使用BitConverter類轉換字節,但是我敢肯定有一種更簡單,更干的方法來執行此操作(我尚未發現)。

如何實現這樣的方法來保持類的甜美和簡單?

編輯:

要從緩沖區讀取,我嘗試了以下操作:

public T Read<T>(bool moveIndex = true) {
    T data = default(T);
    var size = Marshal.SizeOf(data);
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.PtrToStructure(ptr, data);
    Marshal.Copy(_buffer.ToArray(), _readIndex, ptr, size);
    Marshal.FreeHGlobal(ptr);
    if (moveIndex) {
        _readIndex += size;
    }
    return data;
}

但這在此行Marshal.PtrToStructure(ptr,data);中拋出System.ArgumentException

這樣的東西適合您的需求嗎?

public void Write<T>(T value) where T: struct
{
    int size = Marshal.SizeOf(value);
    var bytes = new byte[size];
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.StructureToPtr(value, ptr, true);
    Marshal.Copy(ptr, bytes, 0, size);
    Marshal.FreeHGlobal(ptr);
    _buffer.AddRange(bytes);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM