![](/img/trans.png)
[英]In C#, how do I write a array with a byte* pointer to a FileStream without copying it using Marshal?
[英]How do I Marshal out a Subset byte[] Array in Managed Code?
考虑以下方法(在工厂方法中使用):
private Packet(byte[] rawBytes, int startIndex)
{
m_packetId = BitConverter.ToUInt32(rawBytes, startIndex);
m_dataLength = BitConverter.ToUInt16(rawBytes, startIndex + 4);
if (this.Type != PacketType.Data)
return;
m_bytes = new byte[m_dataLength];
rawBytes.CopyTo(m_bytes, startIndex + Packet.HeaderSize);
}
最后两行代码使我感到浪费。 分配更多的内存并用内存中的值填充它似乎很愚蠢。
使用非托管代码,可能会发生以下情况:
m_bytes = (rawBytes + (startIndex + Packet.HeaderSize));
(我没有通过编译器运行它,因此语法可能已关闭,但是您可以看到这只是指针操作的问题。)
前几天,当API返回的byte []数组实际上是short []数组时,我遇到了类似的问题。
这些类型的数组置换仅仅是使用托管代码的代价,还是我只是想念一种新的思路?
提前致谢。
您是否考虑过重组,以便可能不需要复制?
第一种选择: rawBytes
m_bytes
的引用存储在m_bytes
,并将需要添加到该字节数组的所有访问中的偏移量存储。
第二种选择:将m_bytes
为MemoryStream
,由缓冲区,偏移量和长度构成; 此构造函数也不复制字节缓冲区,而仅允许访问指定的子段。
请记住,避免复制操作的代价是rawBytes
和m_bytes
(数组或流)将是别名,因此对一个的更改也会更改另一个。
是的,这在托管代码中成本更高,但是没有什么可以阻止您使此方法变得unsafe
并进行所需的指针操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.