Я пытаюсь расшифровать предположительно шестнадцатеричную строку. В 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) " # "
,
Это правильный способ декодирования этих данных?
(Прошу прощения, если теги неверны.)
Так как 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
Других решений пока нет …