【问题标题】:Adding multiple byte arrays in c#在 C# 中添加多个字节数组
【发布时间】:2012-10-08 07:50:28
【问题描述】:

我正在开发一个使用字节数组作为权限级别的旧系统。
示例:
00 00 00 00 00 00 00 01 表示他们拥有“完全控制权”
00 00 00 00 00 00 00 02 表示他们有“添加控制”
00 00 00 00 00 00 00 04 表示他们有“删除控制权”

因此,如果用户拥有“00 00 00 00 00 00 00 07”,则意味着他们拥有全部 3 个(据我解释)。

现在,我的问题是我需要知道在创建/检查记录时如何到达“0x07”。
我不知道实际组合 0x01、0x02 和 0x04 的语法,所以我得出了 0x07。

【问题讨论】:

    标签: c# arrays binary byte


    【解决方案1】:

    你或他们在一起:

    0x01 | 0x02 | 0x04 == 0x07
    

    如果您想检查候选字节b 中的各个位:

    Full Control   == b & 0x01
    Add Control    == b & 0x02
    Delete Control == b & 0x04
    

    【讨论】:

    • 我正在处理一个字节数组。根据系统,我只知道会有 8 个字节,但我不知道这些字节将在什么位置。我可能必须将“0x01 0x10”与“0x04 0x00”结合起来才能得出“0x05 0x10” ”。我尝试在字节数组上使用| 运算符,但我被告知它不能使用。
    • 那么,您如何确定字节所在的位置?它们大于零?不,你不能 OR 整个事情,但你可以 OR 单个字节。
    • 我接受了你所说的,只是对数组中的所有 8 个字节做了一个快速的循环来得到我想要的。谢谢!
    【解决方案2】:

    OR 运算符就是您要查找的内容。

    IMO,处理它的一种干净方法是使用枚举:

    [Flags]
    public enum Permisions
    {
        FullControl = 0x1,
        AddControl = 0x2,
        DeleteControl = 0x4
    }
    

    然后,在您的代码中,您可以执行以下操作:

    Permissions userPermissions = Permissions.AddControl | Permissions.DeleteControl;
    bool canDelete = userPermissions.HasFlag(Permissions.DeleteControl);
    

    【讨论】:

    • 正如我上面所说,我正在处理一个字节数组。 | 运算符对它们不起作用。我想我可以遍历数组中的每个字节。
    • 你如何确定哪个字节包含你正在寻找的权限?我的意思是,我假设 byte[0] 将拥有控制一种对象类型的权限,而 byte[1] 将拥有控制另一种对象类型的权限,依此类推。您将检查与您要执行的操作相关联的任何字节。所以你只需做 userPermissions[index] | Permissions.AddControl;
    【解决方案3】:

    您还可以使用BitConverter.ToUInt64 将 8 字节数组转换为 ulong 数组。之后,您将能够对这些 ulong 使用常规的按位运算,并在必要时使用 BitConverter.GetBytes 将结果转换回字节数组。

    如果您必须重复处理权限,您可能希望为此实现一个小型包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多