Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server MSSQL保存.net字节[]数据的特殊顺序是什么?_Sql Server_Binary_Bit_Detect - Fatal编程技术网

Sql server MSSQL保存.net字节[]数据的特殊顺序是什么?

Sql server MSSQL保存.net字节[]数据的特殊顺序是什么?,sql-server,binary,bit,detect,Sql Server,Binary,Bit,Detect,我有一个表,它有一个名为Permission(binary(8))的列,其每一位表示一个特定的操作权限。在silverlight客户端中,我使用bitarry和const整数来管理权限,并且进行得很顺利。客户端代码如下所示: public class StaffBase : INotifyPropertyChanged { public const int OPERATION_A = 0, OPERATION_B = 1, // ...

我有一个表,它有一个名为Permission(binary(8))的列,其每一位表示一个特定的操作权限。在silverlight客户端中,我使用bitarry和const整数来管理权限,并且进行得很顺利。客户端代码如下所示:

 public class StaffBase : INotifyPropertyChanged
{
    public const int
        OPERATION_A = 0,
        OPERATION_B = 1,
        // ...
        // OPERATION_I=i,
        // ...
        OPERATION_63 = 63;

    BitArray permission = null;
    public BitArray Permission 
    {
        get { return permission; }
        set 
        {
            if (permission != value)
            {
                permission = value;
                OnPropertyChanged("Permission");
            }
        }
    }

    bool TestPermission(int permissionName)
    {
        return permission != null && permission[permissionName];
    }

    /* 
     Other code segments
     */
}
permission[10]=true;
现在的问题是,我必须在存储过程中测试权限,不幸的是,我对SQL有点生疏。我在客户端设置了2^10的权限,如下所示:

 public class StaffBase : INotifyPropertyChanged
{
    public const int
        OPERATION_A = 0,
        OPERATION_B = 1,
        // ...
        // OPERATION_I=i,
        // ...
        OPERATION_63 = 63;

    BitArray permission = null;
    public BitArray Permission 
    {
        get { return permission; }
        set 
        {
            if (permission != value)
            {
                permission = value;
                OnPropertyChanged("Permission");
            }
        }
    }

    bool TestPermission(int permissionName)
    {
        return permission != null && permission[permissionName];
    }

    /* 
     Other code segments
     */
}
permission[10]=true;
我想我会在数据库中的列权限中得到一个1024的值。但实际上,列值是0x0004000000000000。似乎SQL和.NET分别采用了不同的字节[]存储策略。现在我正在寻找一种方法来检测权限列的十六位。我试图使用这样的条款:

Permission & power(2,i) > 0

这是不对的。还有一个问题:如果我想测试第63位,电源(2,63)溢出。现在,我希望一些sql大师能给我一个指导。

BitArray按读取顺序写入各个位,即第一位是第一个字节的第7位,第八位是第一个字节的第0位,第九位是第二个字节的第7位等等。因此,最小的解决方案是必须反转位(而不是
幂)(2,i)
,do
power(2,64-i)
。当然,正如您所观察到的,这是非常有限的。一个可以使用高达64位的选项是只使用更大的数据类型-
bigint
。但是,对于任何大于64位的数据类型,您都回到了开始的位置

对于更一般的解决方案,您希望在每个字节的基础上使用二进制字段。您可以使用
substring
函数来实现这一点

select 
  substring(binaryValue, ceiling(cast(@bit as decimal) / 8), 1) 
  & power(2, @bit % 8);
如果未设置指定位,则为零;如果未设置,则为非零值


这里的关键是字符串函数实际上也适用于二进制/图像,因此您可以使用子字符串随意访问任何字节:)

幂函数与浮点值一起工作,并不精确。我不会为此使用幂函数。我曾经考虑过使用BigInt作为存储,现在我只需要大约40个非关联权限。但该项目仅停留在开始阶段,我担心更高权限分辨率的新要求即将到来来自业务部门。字节数组更灵活。如果我只是延长其长度,许多代码(如WCF服务、客户端代理工具)都可以避免重新编码。我决定使用子字符串来解决此问题。建议不错。谢谢。@user1746253很高兴我能提供帮助。请将我的答案标记为正确;)很抱歉,在你提醒我之前,我不知道我应该标出正确的答案。我必须向那些在这里帮助过我的人道歉,因为我没有把他们优雅的回答标记为正确。