Расшифровка шестнадцатеричной строки на 4 части, которые отображаются в двоичную карту значений

Я пытаюсь расшифровать предположительно шестнадцатеричную строку. В MS SQL Server (11.0.2100) данные имеют тип char(8),

В руководствах не было четкого способа расшифровки данных, но они документируют, что они содержат:

Дана шестнадцатеричная строка т.е. 0001003F с длиной 4. Младший байт
справа, старший байт слева. Для каждого из 4
bytesсправочная таблица, которая отображает «бит» на определенную правду
значение было дано. Порядок битов также дается с битом 0 или битом
в самой правой части — 1-й бит, … и т. д.

Таблица выглядит так:

1-й байт:

|Bit Order  | Description   |   1               |   0               |   trigger     |
|-----------|---------------|-------------------|-------------------|---------------|
|BIT0       | state foo     | state foo is ON   | State foo is OFF  |   high level  |
|BIT1       | state bar     | in state bar      | not in state bar  |   high level  |
|                                   ...
|BIT7       | state bazz    | in state bazz     | not in state bazz |   high level  |

(Еще 3 таблицы следуют для следующих 3 других ‘байтов …, каждый из 4’ байтов предположительно имеет 8 равных чисел ‘битов’)

Я думал, что способ декодирования этих данных состоит в том, чтобы разбить шестнадцатеричную строку на 4 части и преобразовать их в двоичную строку шириной, фиксированной с 8.

В PHPВзял пример hex0001003F‘, первый байт был’3F‘, преобразовав в двоичный файл, 0011 1111 (место для ясности). Затем предположили, что значение для первого байта было:

'state foo is on', 'in state bar', ..., 'not in state bazz',

Я также пытался сделать: hex2bin("0001003F") но это выводит strin(4) " # ",

Это правильный способ декодирования этих данных?

(Прошу прощения, если теги неверны.)

1

Решение

Так как 4 байта помещаются в хранилище для целочисленный тип почти на всех платформах (32-разрядных и выше) вы можете преобразовать шестнадцатеричную строку в целое число, а затем использовать побитовые операторы проверить, установлен ли конкретный бит:

$hex_str = '0001003F';
$flags = base_convert($hex_str, 16, 10);

foreach (range(0, 31) as $bit) {
printf("Bit %d: %d\n", $bit, (bool) ($flags & (1 << $bit)));
}

Выход

Bit 0: 1
Bit 1: 1
Bit 2: 1
Bit 3: 1
Bit 4: 1
Bit 5: 1
Bit 6: 0
...
Bit 15: 0
Bit 16: 1
Bit 17: 0
...
Bit 31: 0

Если немного $bit устанавливается (1), то состояние, соответствующее этому биту на.

Код преобразует шестнадцатеричную строку $hex_str в целое число $flags с помощью base_convert функция. Цикл повторяет номера битов в диапазоне [0;31] (начиная с наименее значимого бита). (1 << $bit) выражение является значением 1 сдвинут влево на $bit биты. Таким образом, если номер бита $bit устанавливается, то результат побитового А ТАКЖЕ Операция является ненулевым целым числом. Результат приведен к логический тип для производства 1, если результат не равен нулю, и 0 иначе.

Легко видеть, что вы можете протестировать количество битов одним битом А ТАКЖЕ операция, например:

// Check if at least one of three bits is set, 3rd, 10th, or 11th
$mask = (1 << 3) | (1 << 10) | (1 << 11);
if ($flags & $mask)
printf("At least one of the bits from mask 0x%x is set\n", $mask);

Выход

At least one of the bits from mask 0xc08 is set
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]