VB.NET读取字节/字节数组指定比特位函数的错误修复请求
问题修复:VB.NET 比特位读取函数位置偏移与数组越界优化
问题分析
- 比特位位置偏移:原函数中位移计算使用
8 - pos Mod 8,但从左计数的位置0对应字节的最高位(即比特位索引7,比特位本身从0开始计数),原计算多减1,导致结果整体偏移一位。 - 数组越界返回值不合理:原代码硬编码返回204的对应比特,缺乏灵活性,不符合.NET常规错误处理逻辑。
修复后的代码实现
单字节比特位读取函数
修正位移计算逻辑,确保从左计数的位置与字节比特位正确映射:
Option Strict On Module Module1 Sub Main() Dim result1 As Byte = GetBitByPos(100, 0) ' 预期返回0,对应二进制01100100左数第1位 Dim result2 As Byte = GetBitByPos(100, 1) ' 预期返回1,对应左数第2位 Console.WriteLine($"result1: {result1}, result2: {result2}") Dim result3 As Byte = GetBitByPosArray({100}, 0) Dim result4 As Byte = GetBitByPosArray({100}, 1) Console.WriteLine($"result3: {result3}, result4: {result4}") End Sub Private Function GetBitByPos(value As Byte, pos As Integer) As Byte ' 处理超出0-7范围的位置,取模循环映射 Dim adjustedPos As Integer = pos Mod 8 ' 左数第pos位对应比特位索引为7 - adjustedPos Return CByte((value >> (7 - adjustedPos)) And &H1) End Function
字节数组比特位读取函数(三种越界处理优化方案)
方案1:抛出异常(符合.NET规范,推荐用于严格场景)
Private Function GetBitByPosArray(buffer As Byte(), pos As Integer) As Byte Dim byteIndex As Integer = pos \ 8 If byteIndex >= buffer.Length Then Throw New ArgumentOutOfRangeException(NameOf(pos), "指定位置超出字节数组范围") End If Dim bitOffset As Integer = 7 - (pos Mod 8) Return CByte((buffer(byteIndex) >> bitOffset) And &H1) End Function
方案2:返回默认比特值(如0,适用于宽松容错场景)
Private Function GetBitByPosArray(buffer As Byte(), pos As Integer) As Byte Dim byteIndex As Integer = pos \ 8 If byteIndex >= buffer.Length Then Return 0 ' 越界时默认返回0 End If Dim bitOffset As Integer = 7 - (pos Mod 8) Return CByte((buffer(byteIndex) >> bitOffset) And &H1) End Function
方案3:允许调用者指定默认字节(灵活性最高)
Private Function GetBitByPosArray(buffer As Byte(), pos As Integer, Optional defaultByte As Byte = 0) As Byte Dim byteIndex As Integer = pos \ 8 Dim targetByte As Byte = If(byteIndex < buffer.Length, buffer(byteIndex), defaultByte) Dim bitOffset As Integer = 7 - (pos Mod 8) Return CByte((targetByte >> bitOffset) And &H1) End Function
验证结果
针对十进制100(二进制01100100):
GetBitByPos(100, 0)返回0(左数第1位)GetBitByPos(100, 1)返回1(左数第2位)GetBitByPos(100, 6)返回1(左数第7位)GetBitByPos(100, 7)返回0(左数第8位)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

