鍍金池/ 問答/人工智能  PHP  C++  網(wǎng)絡(luò)安全/ CMPP協(xié)議Msg_Id生成算法

CMPP協(xié)議Msg_Id生成算法

圖片描述

實在搞不懂怎么生成這個MsgId求大神
嘗試過如下寫法 不對

public function msgId($spid, $sqid)
    {
        $timeStr = time();
        echo sprintf("%02d%02d%02d%02d%02d%07d%05d", date('m', $timeStr), date('d', $timeStr), date('H', $timeStr), date('i', $timeStr), date('s', $timeStr), $spid, $sqid) , "\n";
        return sprintf("%02d%02d%02d%02d%02d%07d%05d", date('m', $timeStr), date('d', $timeStr), date('H', $timeStr), date('i', $timeStr), date('s', $timeStr), $spid, $sqid);
    }
    pack("N2C", $this->msgId($Msg_src,$header['sequence_number']), 0)
回答
編輯回答
選擇
    public function msgId($spid, $sqid)
    {
        $timeStr = time();
        //echo bindec(sprintf("%04s%05s%05s%06s%06s%022s%016s",decbin(date('m', $timeStr)),decbin(date('d', $timeStr)),decbin(date('H', $timeStr)),decbin(date('i', $timeStr)),decbin(date('s', $timeStr)),decbin($spid), decbin($sqid)));
        return bindec(sprintf("%04s%05s%05s%06s%06s%022s%016s",decbin(date('m', $timeStr)),decbin(date('d', $timeStr)),decbin(date('H', $timeStr)),decbin(date('i', $timeStr)),decbin(date('s', $timeStr)),decbin($spid), decbin($sqid)));
    }

    $this->msgId('600010','2');

在這里面給你糾正一下思路
第一: 64里面只能存0-1之間的數(shù)值,也就是說都是2進制數(shù)據(jù)
所以拼接一下2進制數(shù)據(jù)就好了

月份(1-12)(【0001-1100】區(qū)間 4位)decbin(date('m', $timeStr))
日(1-31)(【00001-11111】區(qū)間 5位)decbin(date('d', $timeStr))
時(1-24)(【00001-11000】區(qū)間 5位)decbin(date('H', $timeStr))
分(1-59)(【000001-111011】區(qū)間 6位)decbin(date('i', $timeStr))
秒(1-59)(【000001-111011】區(qū)間 6位)decbin(date('s', $timeStr))
網(wǎng)關(guān)代碼(【0~0 - 1~1】22位)decbin($spid1)
// (如果這個網(wǎng)關(guān)代碼是22位0和1組成就不用decbin,本身就是2進制了,如果不是的話,就變成二進制)
序列號(區(qū)間 16位)decbin($spid2)

網(wǎng)關(guān)代碼多少位我沒洗數(shù),序列號,什么的位數(shù)你自己調(diào)就行了%04d%06d%05d%06d%06d【%021d%016d】<-這里 如果沒算錯的話是4+5+5+6+6+22+16應(yīng)該是64位了,那么這64位是一個2進制的字符串,用bindec()轉(zhuǎn)換成十進制的數(shù)值,存進數(shù)據(jù)庫里面,那么數(shù)據(jù)庫存貯的2進制數(shù)據(jù)就是符合你要的規(guī)定了,而且10進制數(shù)據(jù),8位,64字節(jié),完美

變量名用點心$spid, $sqid 我以為是一個

下面這種方法也是簡單,邏輯上不好理解,但是還是挺簡單的,學(xué)習(xí)了

$messageId = 0;
$messageId |= $m << 60;
$messageId |= $d << 55;
$messageId |= $h << 50;
$messageId |= $i << 44;
$messageId |= $s << 38;
$messageId |= $spid << 16;
$messageId |= $sqid & 0xff;
echo $messageId
2018年7月26日 14:30