【问题标题】:Compare byte arrays with masking将字节数组与掩码进行比较
【发布时间】:2023-03-09 00:45:01
【问题描述】:

我想将 2 字节数组与掩码进行比较。所以我有数据和数据模板:

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!");
    }
}

但这看起来有点矫枉过正。也许有更好的方法来做到这一点?

谢谢!

【问题讨论】:

    标签: c# arrays masking


    【解决方案1】:
        for (int i = 0; i < data.Length; i++ )
        {
            if (mask[i] == 0xFF && data[i] != dataTemplate[i]) {
                throw new Exception("arrays dont match!");
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      相关资源
      最近更新 更多