簡體   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