繁体   English   中英

如何编组托管代码中的Subset byte []数组?

[英]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_bytesMemoryStream ,由缓冲区,偏移量和长度构成; 此构造函数也不复制字节缓冲区,而仅允许访问指定的子段。

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

是的,这在托管代码中成本更高,但是没有什么可以阻止您使此方法变得unsafe并进行所需的指针操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM