将128位序列分解为位


break 128 bit sequence to bits

我试图在php中实现一个解析器,它可以读取各种大小的二进制文件(例如$fsize)。在这些文件中,有重复的16字节序列,我想独立处理(一次一个16字节序列)。我已经设法读取并隔离了每一个这样的16字节序列的形式:

正在处理样本[2]。。。

打印16个样本字节

$bit_sequence="00000000101110010000000011001110110101100111101001101010011101110011111100100000000000010100011010010101001101111101000"

阵列:

$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]=>24]=>0[25]=>1[26]=>1[27]=>0[28]=>0[29]=>1[30]=>0[33]=>1[34]=>1[35]=>0[36]=>1[37]=>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[52]=>0[52]=>0[53]=>1[54]=>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]=>0[69]=>1[70]=>1[71]=>0[73]=>0[74]=>1[75]=>1[76]=>1[76]=>1[77]=>1[77]=>1[88]=>1[78]=>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[91]=>0[92]=>0[93]=>0[94]=>0[94]=>0[95]=>0[96]=>1[97]=>0[98]=>1[99]=>0[100]=>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[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]=>temperary[11]=>alarm_abatt[12]=>alarm amem[13]=>alarm-amp[14]=>alarm_alck[15]=>alarm_prx[16]=>alarm_arb[17]=>alarm_awrn[18]=>alarm_Alr[19]=>mask_mbat[20]=>mask_mem[21]=>mask_mtmp[22]=>mask_malck[23]=>mask_smx[24]=>mask_prb[25]=>mask.mwrn[26]=>mask.malr[27]=>sample_rate[28]=>avg_period[29]=>months[30]=>date_time)

我的目标是找到一种方法来处理整个128位序列,就像一个有128个元素的数组一样,并可以选择以这样的方式提取:

bits[0]->存储在变量$wide_avg_txon(布尔值)中

bits[1->15]->存储在变量$wide_avg(15位无符号整数)中

bits[16]->存储在变量$wide_peak_rms(布尔值)中

bits[17->31]->存储在变量$wide_peak(15位无符号整数)中

bits[32->39]->存储在变量$low_pw(8位无符号整数)中

(等等)

bits[112->127]->存储在变量$date_time(16位无符号整数)中

我对php和编程都很陌生。。。

我不知道这是否是最优解。。。但我已经设法使用如下代码将表示1.8或16位二进制序列的字符串存储到变量中:

$wide_avg_txon=子字符串($bit_sequence,0,1);

//wide_avg_txon:1

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

//wide_avg:000000000110000

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

//wide_peak_rms:1

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

//宽峰值:000000000110100

现在我需要以某种方式对这些字符串(表示二进制数)进行数字处理,并将其转换为十进制数。。。

对我发布的解决方案的任何建议都将是有用的,欢迎。。。

事实上,我用一种非常肮脏的方式成功地打破了128位序列:

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

$wide_avg_dec=bindec($wide_avg);

回声;wide_avg:"$wide_avg&";,并且作为十进制:"$wide_avg_dec"quot;;

等等…

您似乎只是在从字符串中生成一个数组:

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个字节),所以这是您可以使用的最多的整数。所以我会在每个字节的基础上工作。