在 C# 中强制转换数组而不进行复制

2024-04-03

我有一系列短裤:

short[] data;

我有一个将字节写入文件的函数:

void Write(byte[] data);

我无法控制此功能,也无法更改它。有没有一种方法可以编写我的短裤数组,而无需先制作冗余副本以将其转换为字节?

像这样的东西:Write((byte[])data);

我不关心字节顺序。我希望将 Shorts 的内存表示形式写入文件,无论 Shorts 的机器表示形式是什么。我知道这种类型转换不能用于任何包含引用的非 POD 类型,但短裤应该可以完美转换。转换应该产生一个指向相同内存的两倍大小的字节数组。

如果这在 C# 中是不可能的,那么 CLR 中是否有任何东西使得这不可能,或者只是 C# 的限制?


我不关心字节顺序。我希望将 Shorts 的内存表示形式写入文件,无论 Shorts 的机器表示形式是什么。

这是第一个不可能的事情 - 字节序改变了内存表示,因此从数组中第一个 Short 的地址开始读取连续字节地址将导致不同的字节模式,具体取决于机器字节序。

第二个不可能的事情是 CLR 中的数组具有与数据一起编码的类型和长度信息。您不能更改此标头信息,否则会破坏垃圾收集器。所以给定一个short[]数组,不能将其转换为byte[]大批。你可能会得到一个byte使用 C++ clr 或不安全代码的指针,但仍然无法访问 CLR 数组。

如果您确实无法控制采用字节数组的代码,您也许可以更改操作短裤的代码。用一个MemoryStream在字节数组上将允许您读取和写入数据,您可以将数组包装为IList<short>,或者您可以只创建访问器扩展函数来获取短裤数据。

public sealed class ShortList :IList<short>
{
    private readonly byte[] _array;

    public short this[int index]
    {
        get { return (short)_array[index/2]<<8 | _array[index/2+1] ; }
    }

    public int Count
    {
        get { return _array.Length/2; }
    }

    ... many more methods in IList
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中强制转换数组而不进行复制 的相关文章

随机推荐