簡體   English   中英

將128位序列分解為位

[英]break 128 bit sequence to bits

我試圖在PHP中實現一個解析器,該解析器讀取各種大小的二進制文件(例如$ fsize)。 在這些文件中,有重復的16字節序列,我想獨立處理(一次一個16字節序列)。 我設法以以下形式讀取和隔離每個這樣的16字節序列:

處理樣品[2] ...

打印16個樣本字節

$ bit_sequence ='10000000010111001000000001100111011010110110011110100110101000100111011100111111000100000000000010100011010010101001101111101000'

數組:

$ 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] =>電池電壓[9] => temperature_spr_flag [10] =>溫度[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個元素的數組,並可以選擇以這種方式提取:

bits [0]->存儲在變量$ wide_avg_txon中(布爾值)

位[1-> 15]->存儲在變量$ wide_avg中(15位無符號整數)

位[16]->存儲在變量$ wide_peak_rms中(布爾值)

位[17-> 31]->存儲在變量$ wide_peak中(15位無符號整數)

位[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);

// wide_peak:0000000001100100

現在我將需要以某種方式處理這些字符串(代表二進制數字)並以數字方式轉換為十進制數字...

對我發布的解決方案的任何建議都將很有用,歡迎您...

實際上,我設法使用一種非常骯臟的方式打破了128位序列:

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

$ wide_avg_dec = bindec($ wide_avg);

回聲“ wide_avg:”。 $ wide_avg。 ”,以及十進制:“。 $ wide_avg_dec。 “”;

等等...

看來您只是從一個字符串創建一個數組:

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個字節),因此這是您可以使用的最多的整數。 因此,我將按字節工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM