You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中读取存储于VARBINARY(MAX)列的C# BitArray

解决方案:SQL Server读取C# BitArray序列化的VARBINARY数据

问题根源在于C# BitArray 和SQL Server GET_BIT 的位序规则不一致:

  • BitArray 的索引n对应字节数组中第n//8个字节的最低位开始数第n%8位(比如索引0是第一个字节的0x01位,索引1是第一个字节的0x02位)
  • SQL Server GET_BIT 的位参数是从每个字节的最高位开始计数(比如位0是第一个字节的0x80位,位7是第一个字节的0x01位)

直接使用BitArray的索引调用GET_BIT会读错位置,因此需要转换位索引后再读取。

自定义函数实现

创建一个标量函数,自动转换位索引,兼容BitArray的位序:

CREATE FUNCTION dbo.GetBitArrayBit(@binary VARBINARY(MAX), @bitIndex INT)
RETURNS BIT
AS
BEGIN
    -- 处理无效输入:空值、索引小于0、索引超出数据总位数
    IF @binary IS NULL OR @bitIndex < 0 OR @bitIndex >= DATALENGTH(@binary)*8
        RETURN 0;

    DECLARE @byteIndex INT = @bitIndex / 8;
    DECLARE @bitWithinByte INT = @bitIndex % 8;
    -- 转换为GET_BIT需要的位偏移:反转字节内的位顺序
    DECLARE @sqlBitIndex INT = @byteIndex * 8 + (7 - @bitWithinByte);

    RETURN GET_BIT(@binary, @sqlBitIndex);
END

使用示例

调用函数读取指定索引的位值,和C#中BitArray的索引完全对应:

-- 读取BitArray索引0和1的位值
SELECT 
    dbo.GetBitArrayBit(MyByteArray, 0) AS Bit0,
    dbo.GetBitArrayBit(MyByteArray, 1) AS Bit1
FROM MyTable 
WHERE MyId = @MyId

针对你提供的测试数据(BitArray[0]=true,BitArray[1]=false),上述查询会返回Bit0=1、Bit1=0,和C#端读取结果一致。

内容的提问来源于stack exchange,提问作者Tom Regan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:04:55