[英]In C#, how do I write a array with a byte* pointer to a FileStream without copying it using Marshal?
[英]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_bytes
為MemoryStream
,由緩沖區,偏移量和長度構成; 此構造函數也不復制字節緩沖區,而僅允許訪問指定的子段。
請記住,避免復制操作的代價是rawBytes
和m_bytes
(數組或流)將是別名,因此對一個的更改也會更改另一個。
是的,這在托管代碼中成本更高,但是沒有什么可以阻止您使此方法變得unsafe
並進行所需的指針操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.