如何读取值类型的第n个字节

时间:2013-10-23 05:21:25

标签: c#

假设我有一个如下定义的值类型:

[StructLayout(LayoutKind.Explicit, Size=40)]
public struct Storage
{
}

这个类的唯一目的是占用40个字节的内存。有没有办法轻松读取第n个字节?例如,我想写这个函数:

byte ReadFromStorage(ref Storage s, int n)
{
}

和写版本类似。我需要此函数的性能尽可能接近以下C代码:

return *((char*)s + n);

2 个答案:

答案 0 :(得分:1)

改为使用Fixed Size Buffers

也就是说,没有什么可以阻止你在unsafe上下文中执行以下操作(假设您使用的是显式布局):

unsafe byte ReadFromStorage(ref Storage s, int n)
{
    fixed(Storage* ptr = &s)
    {
       return ((byte*)ptr)[n];
    }
}

答案 1 :(得分:0)

没有理由为此使用不安全的代码。

static byte ReadFromStorage(Storage s, int n) {
    var handle = default(GCHandle);

    try {
        handle = GCHandle.Alloc(s, GCHandleType.Pinned);
        var ptr = handle.AddrOfPinnedObject();

        var arrSize = Marshal.SizeOf(typeof(Storage));
        var arr = new Byte[arrSize];
        Marshal.Copy(ptr, arr, 0, arrSize);
        return arr[n];

    } finally {
        if (handle.IsAllocated)
            handle.Free();
    }
}

在做了一些来回修改并阅读William的评论之后,它只是对Marshal.ReadByte的调用,但这看起来并不像杂耍处理程序和try-finally-statements那样酷。

var b = Marshal.ReadByte(s, n);