我有一个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数组然后编码该数据,所以我的问题是:
Array.Copy
和编辑,,
更新的循环带有更少的循环和更易读的
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);
}
答案 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()
可能更好地描述了您在此特定情况下所执行的操作