2009-06-01 42 views
0

考虑以下方法(在工厂方法使用):如何编组托管代码中的子集byte []数组?

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返回一个真的是short []数组的byte []数组时,我遇到了类似的问题。

这些类型的数组排列只是使用托管代码的成本,还是存在一个我刚刚失踪的新思维流派?

在此先感谢。

回答

2

您是否考虑过重组,以便副本不是必需的?

第一个选项:在m_bytes中存储对rawBytes的引用,并存储需要添加到该字节数组中的所有访问的偏移量。

第二种选择:使用m_bytes a MemoryStream代替,由缓冲区,偏移量和长度构成;这个构造函数也不会复制字节缓冲区,只允许访问指定的子段。

请记住,虽然避免复制操作的价格是rawBytesm_bytes(数组或流)将是别名,因此对其中一个的更改也会改变另一个。

0

是的,这在托管代码中成本更高,但没有任何东西阻止您制作此方法unsafe并执行您希望执行的指针操作。

相关问题