У меня получился такой вариант:
- Код: Выделить всё
Option Explicit
Sub ExtractBit()
'Извлекает из строкового Hex числа sHex, из iByte байта
'iBlength бит, начиная с iBstart бита.
'Байты в числе считаются слева направо начиная с 1
'Биты в байте считаются справа налево начиная с 1
Dim sHex As String 'hex число в строковом представлении
Dim iByte As Integer 'байт из которого извлекаются биты
Dim iBstart As Integer 'бит с которого начинается извлечение
Dim iBlength As Integer 'число бит, м.б. >8, тогда биты извлекаются из следующего байта числа
Dim iTmpHex As Integer
Dim iNewBstart As Integer
Dim sTmpHex As String
Dim sBit As String
Dim n As Integer
Dim i As Integer
sHex = "9CA3C539" '10011100 10100011 11000101 00111001
iByte = 2 'со второго байта
iBstart = 5 'c пятого бита
iBlength = 8 '8 бит
On Error GoTo exception
n = RoundUp((8 - iBstart + iBlength) / 'число байт, которое нужно взять из sHex
sTmpHex = Mid(sHex, iByte * 2 - 1, n * 2)
Debug.Print "sTmpHex: " & sTmpHex
iTmpHex = CInt("&H" + sTmpHex)
iNewBstart = iBstart + ((n - 1) *
Debug.Print "iNewBstart: " & iNewBstart
If iNewBstart > Len(sTmpHex) * 4 Or iByte <= 0 Or iBstart <= 0 Or iBlength <= 0 Then
Err.Raise -20001
End If
For i = iNewBstart - 1 To iNewBstart - iBlength Step -1
sBit = sBit + IIf((iTmpHex And (2 ^ i)) <> 0, "1", "0")
Next
Debug.Print sBit
Exit Sub
exception:
MsgBox "Выход за границы числа", vbCritical, "ExtractBit()"
End Sub
Public Function RoundUp(ByVal dNumber As Double) As Double
'Округляет число до целого в большую сторону: 1.1=2 1.9=2
If dNumber <> Fix(dNumber) Then
RoundUp = Fix(dNumber) + 1
Else
RoundUp = dNumber
End If
End Function
Скажите, пожалуйста, есть более быстрые и оптимальные способы?
Или может быть есть какие-то ошибки.