代码之家  ›  专栏  ›  技术社区  ›  Robert H.

如何在托管代码中封送子集字节[]数组?

c#
  •  0
  • Robert H.  · 技术社区  · 16 年前

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

    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返回了一个字节[]数组(实际上是一个短的[]数组)时,我遇到了类似的问题。

    这些类型的数组排列仅仅是使用托管代码的成本,还是有一个新的学派认为我只是缺少了?

    事先谢谢。

    2 回复  |  直到 16 年前
        1
  •  2
  •   jerryjvl    16 年前

    您是否考虑过重组,这样就不需要复制了?

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

    第二种选择:制造 兆字节 MemoryStream 相反,从缓冲区、偏移量和长度构造;这个构造函数也不复制字节缓冲区,只允许访问指定的子段。

    尽管避免复制操作的代价是 罗氏字节 兆字节 (数组或流)将是别名,因此对其中一个的更改也将更改另一个。

        2
  •  0
  •   Andrew Hare    16 年前

    是的,这在托管代码中成本更高,但没有什么能阻止您使用此方法。 unsafe 做你想做的指针操作。