如何在托管代码中生成子集byte []数组?

时间:2009-06-01 00:32:29

标签: c#

考虑以下方法(在工厂方法中使用):

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 个答案:

答案 0 :(得分:2)

您是否考虑过重组以便可能不需要复制?

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

第二个选项:使m_bytes改为MemoryStream,从缓冲区构造,偏移量和长度;此构造函数也不复制字节缓冲区,只允许访问指定的子段。

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

答案 1 :(得分:0)

是的,这在托管代码中代价更高,但没有什么可以阻止您使用此方法unsafe并执行您希望执行的指针操作。