Сравните байтовые массивы с маскировкой - PullRequest
1 голос
/ 09 марта 2011

Я хочу сравнить 2-байтовые массивы с маскировкой. Итак, у меня есть данные и dataTemplate:

byte[] data = new byte[] { 0x3b, 0xfe, 0x18, 0x00, 0x00, 0x80, 0x31, 0xfe, 
                           0x45, 0x45, 0x73, 0x74, 0x75, 0x49, 0x44, 0x20, 
                           0x76, 0x65, 0x72, 0x20, 0x31, 0x2e, 0x30, 0xa8 };

byte[] dataTemplate = new byte[] { 0x66, 0xfe, 0x18, 0x00, 0x00, 0x80, 0x31, 0xfe,
                                   0x45, 0x45, 0x73, 0x74, 0x75, 0x49, 0x44, 0x20, 
                                   0x76, 0x65, 0x72, 0x20, 0x31, 0x2e, 0x30, 0xa8 };

А у меня есть маска:

byte[] mask = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                           0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
                           0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00 };

Все байты, которые 0x00 могут быть изменены и 0xFF не могут быть изменены. Поэтому, когда я сравниваю data и dataTemplate, скажем, что data[0] может быть 0x3b в одном массиве и что-то еще в другом. Но data[9] должен быть одинаковым в обоих. Прямо сейчас я делаю это так:

List<byte> maskedDataList = new List<byte>();

for (int i = 0; i < data.Length; i++ )
{
    byte maskedByte = (byte)((dataTemplate[i] & mask[i]));
    atrList.Add(maskedByte);
}

for (int i = 0; i < data.Length; i++)
{
    if ((data[i] & maskedDataList[i]) != MaskedDataList[i])
    {
        throw new Exception("arrays dont match!");
    }
}

Но это похоже на излишество. Может быть, есть лучшие способы сделать это?

Спасибо!

1 Ответ

3 голосов
/ 09 марта 2011
    for (int i = 0; i < data.Length; i++ )
    {
        if (mask[i] == 0xFF && data[i] != dataTemplate[i]) {
            throw new Exception("arrays dont match!");
        }
    }
...