C#,是否可以在没有副本的情况下将 byte* 转换为 byte[]?最快的方法是什么?

标签 c# arrays sockets pointers unsafe

我有一个来自套接字连接的大 byte[] receiveBuffer,其中包含多个数据包。

我想将单个数据包传递到应用程序中的下一层,但我不想将每个数据包复制到一个新数组中。

我现在正在做这样的事情

fixed (byte* rxBufferPtr = receiveBuffer)
{
    while(more_packets_in_rx_buf)
    {
       NewPacketReceived(rxBufferPtr + offset, packetSize);
        // NewPacketReceived params: NewPacketReceived(byte* packet, int size)
       offset += packetSize;
    }
}

我想传递一个托管数组而不是指针和大小,新的 NewPacketReceived 参数将是:NewPacketReceived(byte[] packet)

我从不重复使用接收缓冲区,它已满后会创建一个新缓冲区。

最佳答案

不,你不能不复制。传递偏移量或长度是可行的方法。您不必不安全,它并不总是更快。 ArraySegment结构可以帮助您将偏移量与数组一起传递。

关于C#,是否可以在没有副本的情况下将 byte* 转换为 byte[]?最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6849715/

相关文章:

c# - WPF 标签对齐和分布文本

c# - 如何对字符串列表的列表进行排序

php - 我做了一个可怕的循环....请帮助修复我的逻辑

c++ - 套接字错误的好资源?

c# - 在特定位置向内容类型添加字段

javascript - 将一维数组插入二维数组的谷歌脚本

javascript - 清除数组中一项的超时 - javascript

java - 无法通过 UDP 通过套接字从设备(在 WLAN 中)接收数据

node.js - 使用 Socket.io 连接到特定的服务器 IP

c# - 在 VS 中从 C# 调用 C++ DLL 失败。在 VS 外运行 exe,它可以工作