我有一系列短裤:
short[] data;
我有一个将字节写入文件的函数:
void Write(byte[] data);
我不控制这个功能,也无法改变它.有没有办法编写我的短裤数组而不首先将冗余拷贝转换为字节?
像这样的东西: Write((byte[])data);
我不关心字节序.我希望在短的机器表示中写入文件的短路的内存表示.我理解这种类型的强制转换不适用于包含引用的任何非POD类型,但短路应该是完全可转换的.强制转换应该导致字节数组的大小是指向同一内存的两倍.
如果在C#中这是不可能的,那么CLR中是否存在使其无法实现的任何内容,或者仅仅是C#限制?
我不关心字节序.我希望在短的机器表示中写入文件的短路的内存表示.
这是第一个不可能的事情 - 字节序更改了内存表示,因此从数组中第一个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
Run Code Online (Sandbox Code Playgroud)