在C#cast数组中没有复制

时间:2016-11-28 13:32:53

标签: c# arrays casting

我有一系列短裤:

short[] data;

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

void Write(byte[] data);

我无法控制此功能,无法更改。有没有办法编写我的短裤数组而不首先将冗余拷贝转换为字节?

类似的东西:Write((byte[])data);

我不关心字节序。我希望在短的机器表示中写入文件的短路的内存表示。我理解这种类型的强制转换不适用于包含引用的任何非POD类型,但短路应该是完全可转换的。强制转换应该导致字节数组的大小是指向同一内存的两倍。

如果在C#中这是不可能的,CLR中有什么东西可以使这个变得不可能,或者它只是C#限制吗?

2 个答案:

答案 0 :(得分:5)

  

我不关心字节序。我希望在短的机器表示中写入文件的短裤的内存表示。

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

第二个不可能的事情是CLR中的数组具有用数据编码的类型和长度信息。您无法更改此标头信息,否则您将破坏垃圾收集器。因此,给定short[]数组,您无法将其转换为byte[]数组。您可能会使用C ++ clr或不安全的代码到达byte指针,但您仍然无法访问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

答案 1 :(得分:-2)

怎么样?
Write(data.SelectMany(x => BitConverter.GetBytes(x)).ToArray());