循环技术C#

时间:2016-02-17 08:45:53

标签: c# loops

我有一个SmartCard项目,每次需要节省16个字节以供更广泛的SC读卡器使用,不确定每次限制时要保存的字节大小,但我使用Identive SCL011使用更多数量的编码数据失败了读者,并且因为并非所有数据都有16个倍数,当然在重新调整数据大小后应​​该进行一些循环和分配。

所以我提出的最简单的循环如下

int Index = 0;
for(int i =0; i < blocksNumber; i++)
{
    byte temp = new byte[16];
    for(int x = 0; x < 16; x++, Index++)
        temp[x] = data[Index];
//and encode/write data to the card
}

foreach(var item in blocksList)
{
    byte temp = new byte[16];
    for(int x = 0; x < 16; x++)
        temp[x] = data[Index];
//and encode/write data to the card
}

所以,每次我必须遍历数据以将其分配给Temp数组然后编码该数据,所以我的问题是:

  1. 最好使用Array.Copy
  2. 它比主循环中的循环更快吗?
  3. 还是有另一种更快的方法吗?
  4. 编辑,,

    更新的循环带有更少的循环和更易读的

                int DestinationIndex = 0;
                int BlockSize = 16;
                int SourceIndex = 0;
                try
                {
                    byte[] Data = Encoding.UTF8.GetBytes(txtData.Text.Trim());
                    Array.Resize(ref Data, 320);
                    for (int i = 0; i < 20; i++, SourceIndex = SourceIndex + 16)
                    {
                        byte[] temp = new byte[16];
                        Buffer.BlockCopy(Data, SourceIndex, temp, DestinationIndex, BlockSize);
                        mf.Write(BlocksList[i], temp);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    

1 个答案:

答案 0 :(得分:3)

我将如何做到这一点:

int blockSize = 16;
byte[] data = new byte[blockSize * 1000]; // Just for example.

// Fill data[] somehow.

byte[] buffer = new byte[blockSize];

for (int i = 0; i < data.Length - blockSize; i += blockSize)
{
    Buffer.BlockCopy(data, i, buffer, 0, blockSize);

    // Do something with buffer[];
}

Buffer.BlockCopy()非常快。而且您不需要继续重新创建16字节缓冲区 - 您可以在循环外创建它一次。

请注意,如果输入数据不是块大小的倍数,则此代码将忽略输入数据末尾的额外字节。

另请注意,对于字节数组,Array.Copy()可能大致处于相同的速度(因为它在内部针对此类事物进行了优化),但Buffer.BlockCopy()可能更好地描述了您在此特定情况下所执行的操作