C#如何将字节写入byte[]数组的中间

C#如何将字节写入byte[]数组的中间,c#,.net,C#,.net,下面的函数ReadPipe()读取字节块,我需要每个字节块转到byte[]数据包缓冲区中的下一个位置。但我不知道如何告诉.ReadPipe在数据包缓冲区内写入字节 如果是C,我可以指定:*packet_buffer[下一块的字节索引] 我如何在C#中实现这一点 public static int receive\u SetStreamPipe\u 2(字节[]数据包缓冲区,int字节到读取) { uint接收的\u块\u字节=0; int剩余字节=字节到读取; int total_transfe

下面的函数ReadPipe()读取字节块,我需要每个字节块转到byte[]数据包缓冲区中的下一个位置。但我不知道如何告诉.ReadPipe在数据包缓冲区内写入字节

如果是C,我可以指定:*packet_buffer[下一块的字节索引]

我如何在C#中实现这一点

public static int receive\u SetStreamPipe\u 2(字节[]数据包缓冲区,int字节到读取)
{
uint接收的\u块\u字节=0;
int剩余字节=字节到读取;
int total_transfer_bytes=0;
//使用DataPipeInformation获取实际的管道ID
ftStatus=USB_设备_选择0.SetStreamPipe(FT_管道_信息.PipeId,(UInt32)字节_至_读取);
如果(ftStatus!=FTDI.FT\u STATUS.FT\u OK)
return-(int)ftStatus;//查找:FTDI.FT\u状态
//对于每个块'o字节:
对于(;;)
{
//从FPGA读取字节块:
ftStatus=USB\u设备\u选择0.ReadPipe(FT\u pipe\u information.PipeId,

packet_buffer(剩余的_字节),对您的代码进行以下假设,我真的不应该这样做,请阅读[ask],并提供所有相关细节:

  • receive\u SetStreamPipe\u 2(字节[]数据包缓冲区,int字节到读取)
    • 是由你来实现的
    • packet\u buffer
      中接收一个数组,该数组的长度至少为
      bytes\u-to-u-read
      且需要精确填充
      bytes\u-to-u-read
      字节
  • USB\u设备\u选择0.ReadPipe(FT\u pipe\u information.PipeId,数据包缓冲区,(uint)剩余字节,ref接收到的块字节)
    • 从索引0填充
      数据包\u缓冲区
      ,并且没有带有偏移量的重载(例如)
    • 最多将其填充到剩余的\u字节,但可能更少
    • 接收的\u块\u字节
      分配给已读取的字节数
然后,您需要引入一个临时缓冲区,并将其复制到最终缓冲区中。该缓冲区的最佳大小应该可以从API信息中获得,但我们需要1024字节:

uint received_chunk_bytes = 0;
int remaining_bytes = bytes_to_read;
int total_transferred_bytes = 0;

// Create a smaller buffer to hold each chunk
int chunkSize = 1024;
byte[] chunkBuffer = new byte[chunkSize];

// ...

for (;;)
{
    // Read chunk of bytes from FPGA into chunkBuffer, chunk size being the the buffer size or the remaining number of bytes, whichever is less
    ftStatus = USB_device_selection0.ReadPipe(FT_pipe_information.PipeId, 
                                              chunkBuffer
                                              (uint)Math.Min(chunkSize, remaining_bytes),
                                              ref received_chunk_bytes);

    if (ftStatus != FTDI.FT_STATUS.FT_OK)                 
                    return -(int)ftStatus;     // lookup:    FTDI.FT_STATUS

    // Copy the chunk into the output array
    Array.Copy(chunkBuffer, 0, packet_buffer, total_transferred_bytes, received_chunk_bytes);

    total_transferred_bytes +=  (int)received_chunk_bytes;
    remaining_bytes -=  (int)received_chunk_bytes;

    // ...

根据CodeCaster的回答,到目前为止最好的答案是,我已要求生产USB主机驱动程序的FTDI公司提供一个带有偏移量的重载。

因此,为每次读取创建一个缓冲区,并将其复制到目标缓冲区中?1.创建一个更大的数组,可以将两个数组放在一起。2.使用CopyTo方法复制之前的数据e、 新建,并在部分之后插入目标数组。|通常情况下,数组不能增长或允许轻松插入。对于此类函数,请使用列表[T]。使用列表对象以便可以附加到列表中。数组需要调整大小以添加更多数据。@jdweng他们事先知道大小,需要填充方法的数组参数,API的参数也需要是数组。因此列表将是不必要的额外变量。@CodeChaos这很有趣。不FFSET重载(将解决问题!)。是的,我一直使用临时缓冲区,因为它会降低性能,所以我想消除这个问题。这个答案没有回答这个问题:如何在数组中间写字节。“如果用于写入阵列的API不支持偏移量,则不能,因此这里有一个解决方法”。如果这会导致性能问题,则显示您的代码以及存在的问题。换句话说,您必须传递一个
字节[]
到该方法,并且您不能传递偏移量,因此您不能将任意点写入该数组。我确实没有在这里获得投票。您可能不喜欢“您不能”的答案,但这是一个答案
uint received_chunk_bytes = 0;
int remaining_bytes = bytes_to_read;
int total_transferred_bytes = 0;

// Create a smaller buffer to hold each chunk
int chunkSize = 1024;
byte[] chunkBuffer = new byte[chunkSize];

// ...

for (;;)
{
    // Read chunk of bytes from FPGA into chunkBuffer, chunk size being the the buffer size or the remaining number of bytes, whichever is less
    ftStatus = USB_device_selection0.ReadPipe(FT_pipe_information.PipeId, 
                                              chunkBuffer
                                              (uint)Math.Min(chunkSize, remaining_bytes),
                                              ref received_chunk_bytes);

    if (ftStatus != FTDI.FT_STATUS.FT_OK)                 
                    return -(int)ftStatus;     // lookup:    FTDI.FT_STATUS

    // Copy the chunk into the output array
    Array.Copy(chunkBuffer, 0, packet_buffer, total_transferred_bytes, received_chunk_bytes);

    total_transferred_bytes +=  (int)received_chunk_bytes;
    remaining_bytes -=  (int)received_chunk_bytes;

    // ...