c# - 将字节数组与掩码进行比较

标签 c# arrays masking

我想比较 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!");
    }
}

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

谢谢!

最佳答案

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

关于c# - 将字节数组与掩码进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251355/

相关文章:

c# - 如何解析表名的 SQL 查询语句

javascript - 如何获取数组中最大值的索引? JavaScript

java - 屏蔽从控制台输入的密码 : Java

c# - 在 Xamarin.Forms MVVM 应用程序中加载数据的位置?

c# - 是否可以将 Windows 窗体中的表格用作矩阵?

c - 基于\0 终止的循环无法正常工作?

php - PHP 中的随机关联数组值

java - java中如何屏蔽一个值?

php - php 中的隐藏密码

c# - 将遗留代码库从 VB 转换为 C# 是否有任何值(value)?