разбить 128-битную последовательность на биты

я пытаюсь реализовать в php парсер, который читает бинарные файлы разного размера (например, $fsize). В этих файлах есть повторяющиеся 16-байтовые последовательности, которые я хочу обрабатывать независимо (по одной 16-байтовой последовательности за раз). Мне удалось прочитать и выделить каждую такую ​​16-байтовую последовательность в виде:

образец обработки[2]...

Печать 16 байтов выборки

$bit_sequence='10000000010111001000000001100111011010110110011110100110101000100111011100111111000100000000000001010001101001010101010101010111

Множество:

$bits=( [0] => 1 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 [7] = > 0 [8] => 0 [9] => 1 [10] => 0 [11] => 1 [12] => 1 [13] => 1 [14] => 0 [15] => 0 [16] => 1 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24 ] => 0 [25] => 1 [26] => 1 [27] => 0 [28] => 0 [29] => 1 [30] => 1 [31] => 1 [32] = > 0 [33] => 1 [34] => 1 [35] => 0 [36] => 1 [37] => 0 [38] => 1 [39] => 1 [40] => 0 [41] => 1 [42] => 1 [43] => 0 [44] => 0 [45] => 1 [46] => 1 [47] => 1 [48] => 1 [49 ] => 0 [50] => 1 [51] => 0 [52] => 0 [53] => 1 [54] => 1 [55] => 0 [56] => 1 [57] = > 0 [58] => 1 [59] => 0 [60] => 0 [61] => 0 [62] => 1 [63] => 0 [64] => 0 [65] => 1 [66] => 1 [67] => 1 [68] => 0 [69] => 1 [70] => 1 [71] => 1 [72] => 0 [73] => 0 [74 ] => 1 [75] => 1 [76] => 1 [77] => 1 [78] => 1 [79] => 1 [80] => 0 [81] => 0 [82] = > 0 [83] => 1 [84] => 0 [85] => 0 [86] => 0 [87] => 0 [88] => 0 [89] => 0 [90] => 0 [91] => 0 [92] => 0 [93] => 0 [94] => 0 [95] => 0 [96] => 1 [97] => 0 [98] => 1 [99 ] => 0 [1 00] => 0 [101] => 0 [102] => 1 [103] => 1 [104] => 0 [105] => 1 [106] => 0 [107] => 0 [108] => 1 [109] => 0 [110] => 1 [111] => 0 [112] => 1 [113] => 0 [114] => 0 [115] => 1 [116] => 1 [117] => 0 [118] => 1 [119] => 1 [120] => 1 [121] => 1 [122] => 1 [123] => 0 [124] => 1 [ 125] => 0 [126] => 0 [127] => 0 )

У меня также есть массив, содержащий переменные, в которых я хочу сохранить указанную выше информацию...

Множество:

$variables=( [0] => wide_avg_txon [1] => wide_avg [2] => wide_peak_rms [3] => wide_peak [4] => low_pw [5] => low_pp [6] => high_pw [7] = > high_pp [8] => battery_voltage [9] => Temperature_spr_flag [10] => Temperature [11] => alarm_abat [12] => alarm_amem [13] => alarm_atmp [14] => alarm_alck [15] => alarm_prx [16] => alarm_arpb [17] => alarm_awrn [18] => alarm_aalr [19] => mask_mbat [20] => mask_mmem [21] => mask_mtmp [22] => mask_mlck [23] => mask_smx [24 ] => mask_mprb [25] => mask_mwrn [26] => mask_malr [27] => sample_rate [28] => avg_period [29] => месяцы [30] => date_time )

Моя цель - найти способ обработки всей 128-битной последовательности, например массива из 128 элементов, и иметь возможность извлекать таким образом:

биты [0] -> сохранить в переменной $wide_avg_txon (логическое значение)

биты [1-> 15] -> сохранить в переменной $wide_avg (15-битное целое число без знака)

биты[16] -> сохранить в переменной $wide_peak_rms (логическое значение)

биты [17-> 31] -> сохранить в переменной $wide_peak (15-битное целое число без знака)

bits[32->39] -> сохранить в переменной $low_pw (8-битное целое число без знака)

.... (и так далее)

биты[112->127]-> хранить в переменной $date_time (16-битное целое число без знака)

я совсем новичок в php и в программировании тоже...

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

$wide_avg_txon = substr($bit_sequence,0,1);

//wide_avg_txon: 1

$wide_avg = '0'.substr($bit_sequence,1,15);

//wide_avg: 0000000001100000

$wide_peak_rms = substr($bit_sequence,16,1);

//wide_peak_rms: 1

$wide_peak = '0'.substr($bit_sequence,17,15);

//широкий_пик: 0000000001100100

теперь мне нужно будет каким-то образом обработать эти строки (представляющие двоичные числа) численно и преобразовать в десятичные числа...

Любые предложения по моему опубликованному решению будут полезны и приветствуются...


person thanili    schedule 21.08.2012    source источник
comment
Побитовый оператор и для изоляции битов и т.п.: (0x43 & 0xF) == 0x3). Вы даже можете использовать его, чтобы определить, является ли целое число странно: function isOdd($value) { return ($value & 1); }   -  person Cole Johnson    schedule 22.08.2012


Ответы (2)


На самом деле мне удалось сломать 128-битную последовательность, как я хотел, используя довольно грязный способ:

$wide_avg = '0'.substr($bit_sequence,1,15);

$wide_avg_dec=bindec($wide_avg);

эхо широкое_среднее: . $wide_avg . , и как десятичное: . $wide_avg_dec . ;

и так далее...

person thanili    schedule 22.08.2012

Кажется, вы просто делаете массив из строки:

function getArrayFromString($string)
{
    $length = strlen($string);
    $ret = array();
    for ($i = 0; $i < $length; $i++)
    {
        $ret[] = $string[$i];
    }
}

Однако похоже, что вы используете последовательность байтов, например флаги. Это должно быть похоже на то, что вам нужно:

define("ADMIN_PRIV", 1); // 1<<1
define("DEV_PRIV", 4); // 1<<3
if ($byte & ADMIN_PRIV)
{
    // this user is admin
}

однако целое число PHP имеет длину всего 32 бита (4 байта), так что это максимум, с которым вы можете работать. Поэтому я бы работал на побайтовой основе.

person Cole Johnson    schedule 21.08.2012
comment
На самом деле я пытаюсь проанализировать некоторые двоичные файлы, которые содержат несколько образцов из модемных передач (каждый образец имеет длину 16 байт). Я пытаюсь разделить каждый бит, потому что каждая 128-битная последовательность содержит, например: флаги (1-битная логическая информация), 5-битная информация, соответствующая целому без знака, 7-битная информация, соответствующая целому без знака, 15-битная информация, которая соответствует целому числу без знака... Поэтому я не думаю, что смогу работать на уровне байтов. Мне нужно будет извлечь битовую информацию, как описано в моем вопросе... - person thanili; 22.08.2012