CMPP协议Msg_Id生成算法

发布于 2022-09-07 22:37:06 字数 643 浏览 15 评论 0

图片描述

实在搞不懂怎么生成这个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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

中性美 2022-09-14 22:37:06
    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之间的数值,也就是说都是2进制数据
所以拼接一下2进制数据就好了

月份(1-12)(【0001-1100】区间 4位)decbin(date('m', $timeStr))
日(1-31)(【00001-11111】区间 5位)decbin(date('d', $timeStr))
时(1-24)(【00001-11000】区间 5位)decbin(date('H', $timeStr))
分(1-59)(【000001-111011】区间 6位)decbin(date('i', $timeStr))
秒(1-59)(【000001-111011】区间 6位)decbin(date('s', $timeStr))
网关代码(【0~0 - 1~1】22位)decbin($spid1)
// (如果这个网关代码是22位0和1组成就不用decbin,本身就是2进制了,如果不是的话,就变成二进制)
序列号(区间 16位)decbin($spid2)

网关代码多少位我没洗数,序列号,什么的位数你自己调就行了%04d%06d%05d%06d%06d【%021d%016d】<-这里 如果没算错的话是4+5+5+6+6+22+16应该是64位了,那么这64位是一个2进制的字符串,用bindec()转换成十进制的数值,存进数据库里面,那么数据库存贮的2进制数据就是符合你要的规定了,而且10进制数据,8位,64字节,完美

变量名用点心$spid, $sqid 我以为是一个

下面这种方法也是简单,逻辑上不好理解,但是还是挺简单的,学习了

$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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文