c#通用的Buffer读/写方法
本文关键字:方法 Buffer | 更新日期: 2023-09-27 18:19:21
我一直在尝试编写一个Buffer类,让我使用泛型方法写入和读取内部列表缓冲区。在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));
}
…但是它说,最好的重载有一些无效的参数(value)。
我在读取byte、short、ushort、int或uint类型的值时也有问题。我当然可以确定T的类型,然后使用BitConverter类来转换字节,但我确信有一个更简单和DRY的方法来做到这一点(我还没有发现)。
如何实现这样的方法来保持类的甜蜜和简单?
编辑:要从缓冲区中读取,我尝试了以下操作:
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中的ArgumentException。PtrToStructure (ptr、数据);
这样的东西适合您的需要吗?
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);
}