Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用索引不是0的数据填充数组?_C#_Arrays - Fatal编程技术网

C# 如何用索引不是0的数据填充数组?

C# 如何用索引不是0的数据填充数组?,c#,arrays,C#,Arrays,我正在尝试创建一个固件更新实用程序,它将从文件中读取新固件,并通过USB将其作为数据包发送到8位微控制器。因为数据包是通过i2c发送的,所以将数据作为字节数组处理是最简单的。我希望每个数据包的格式为: 字节0和1=数据包编号 字节2-258=数据 字节259和260=校验和 问题是文件的ReadBytes函数以字节数组的形式返回数据。与其创建多个大型数组,不如让函数从索引2开始填充我们的数据包数组。下面是一个代码示例: BinaryReader reader = new BinaryRead

我正在尝试创建一个固件更新实用程序,它将从文件中读取新固件,并通过USB将其作为数据包发送到8位微控制器。因为数据包是通过i2c发送的,所以将数据作为字节数组处理是最简单的。我希望每个数据包的格式为:

  • 字节0和1=数据包编号
  • 字节2-258=数据
  • 字节259和260=校验和
问题是文件的
ReadBytes
函数以字节数组的形式返回数据。与其创建多个大型数组,不如让函数从索引2开始填充我们的数据包数组。下面是一个代码示例:

BinaryReader reader = new BinaryReader(new FileStream(directory, FileMode.Open));
byte[] packet = new byte[260];

// Create and send packet
for (ushort i = 0; i < numOfPacketsNeeded; i++)
{
    // Set current packet index
    packet[0] = (byte)i;
    packet[1] = (byte)(i >> 8);

    // Start filling at packet[2]
    packet[] = reader.ReadBytes(256);

}
binarydreader=newbinarydreader(newfilestream(directory,FileMode.Open));
字节[]数据包=新字节[260];
//创建并发送数据包
对于(ushort i=0;i>8);
//从数据包[2]开始填充
packet[]=reader.ReadBytes(256);
}
我最初的尝试是创建一个“FirmwarePacketModel”,其中packet.data是它自己的256字节数组,索引和校验和是ushort。我不喜欢这个,因为它创建了一个260字节的模型,但是我们仍然需要创建一个260字节的数组来提供给USB驱动程序

我正在考虑的另一件事是:

for (count = 2; count < 260; count ++)
{
    packet[count] = reader.ReadBytes(1);
}
for(计数=2;计数<260;计数++)
{
数据包[计数]=读取器.ReadBytes(1);
}

但我担心这似乎是草率和浪费。什么是有效的解决方案?

如果从其他程序接收到无法更改的缓冲区,则可以使用
Array.CopyTo
方法从索引
2
复制

BinaryReader reader = new BinaryReader(new FileStream(directory, FileMode.Open));
byte[] packet = new byte[262];
// Create and send packet
for (ushort i = 0; i < 10; i++)
{
    // Set current packet index
    packet[0] = (byte)i;
    packet[1] = (byte)(i >> 8);

    // Copy read buffer starting index 2 
    reader.ReadBytes(256).CopyTo(packet,2); //starting at index 2
}

如果从其他程序接收到无法更改的缓冲区,则可以使用
Array.CopyTo
方法从索引
2
进行复制

BinaryReader reader = new BinaryReader(new FileStream(directory, FileMode.Open));
byte[] packet = new byte[262];
// Create and send packet
for (ushort i = 0; i < 10; i++)
{
    // Set current packet index
    packet[0] = (byte)i;
    packet[1] = (byte)(i >> 8);

    // Copy read buffer starting index 2 
    reader.ReadBytes(256).CopyTo(packet,2); //starting at index 2
}

Read方法有一个重载读取(byte[],int,int),其中第一个参数是要填充的字节数组,第二个参数是要开始填充的偏移量,第三个参数是要从文件中读取的字节数。这就是你要找的吗<代码>读卡器读取(数据包,2256)@OguzOzgul:是的,我走了这条路。还没有测试过,但它看起来和我需要的一模一样!非常感谢。Read方法有一个重载读取(byte[],int,int),其中第一个参数是要填充的字节数组,第二个参数是要开始填充的偏移量,第三个参数是要从文件中读取的字节数。这就是你要找的吗<代码>读卡器读取(数据包,2256)@OguzOzgul:是的,我走了这条路。还没有测试过,但它看起来和我需要的一模一样!非常感谢。这肯定不是有效的解决方案,因为填充数组只是为了将其立即复制到某个地方else@Zereges你说得对。若OP从其他源读取数据,那个么很明显,读取到另一个数组,然后复制到
数据包
并不是最佳方式<代码>读取器。从索引中读取是最好的
CopyTo
是最适合的,如果OP正在获取其他程序/库,而他无法更改。谢谢你们!是的,事情很简单,但我没有发现任何“优雅”的东西。我不知道这是否重要,但正在读取的文件将是十六进制的。这似乎排除了
read.read()
@liquidair欢迎您。如果读取的数据是
hexadecimal
,则可以使用任何一种方法,因为每个字符(如文件中所示)的长度都是1字节。无论文件的格式如何,读取的数据都是字节。reader.Read(byte[],int,int)似乎是这里的最佳解决方案,因为它不创建数组的克隆(reader.ReadBytes创建新数组)。但是应该检查reader.Read()的返回值。它将返回实际读取的字节数,这意味着,如果文件内容耗尽,最后一个块的读取可能少于256字节。在这种情况下,由于我们在将“byte[]packet”传递给reader.Read()之前没有清除它,因此必须格外小心。这肯定不是有效的解决方案,因为填充数组只是为了将其立即复制到某个地方else@Zereges你说得对。若OP从其他源读取数据,那个么很明显,读取到另一个数组,然后复制到
数据包
并不是最佳方式<代码>读取器。从索引中读取是最好的
CopyTo
是最适合的,如果OP正在获取其他程序/库,而他无法更改。谢谢你们!是的,事情很简单,但我没有发现任何“优雅”的东西。我不知道这是否重要,但正在读取的文件将是十六进制的。这似乎排除了
read.read()
@liquidair欢迎您。如果读取的数据是
hexadecimal
,则可以使用任何一种方法,因为每个字符(如文件中所示)的长度都是1字节。无论文件的格式如何,读取的数据都是字节。reader.Read(byte[],int,int)似乎是这里的最佳解决方案,因为它不创建数组的克隆(reader.ReadBytes创建新数组)。但是应该检查reader.Read()的返回值。它将返回实际读取的字节数,这意味着,如果文件内容耗尽,最后一个块的读取可能少于256字节。在这种情况下,由于我们在将“byte[]packet”传递给reader.Read()之前没有清除它,因此必须格外小心。