总体解析流程 (以经纬度为例)
1.通过 == bin2hex() == 方法, 将接收到的内容从ASCII字符转换为16进制的字符串(如:7e0200***)
2.将字符串已两个为一组分隔成字节数组,如: ['7E', '02', '00' ...], 这里对粘包需要特殊处理
3.选取下标为21-24的4组作为经度, 25到28的4组作为纬度
4.对经纬度解析: 如 01 5a 49 ea
// 1.先是将16进制转换为10进制
$a = base_convert("01", 16, 10); // => 1
$b = base_convert("5a", 16, 10); // => 90
$c = base_convert("49", 16, 10) ; //=> 73
$d = base_convert("ea", 16, 10); // => 234
// 2.将结果位运算后相加 (第一个左移24次, 第二个左移16次, 第三个左移8次, 第四个不变)
$result = ($a << 24) + ($b << 16) + ($c << 8) + $d
左移: 二进制世界里往左移动其实是相当于乘以了2
等同于: $result = (1 << 24) + (90 << 16) + (73 << 8) + 234
等同于: $result = (1 * 2 ^24) + (90 * 2^16) + (73 * 2 ^8) + 234
等同于: $result = 16777216 + 5898240 + 18688 + 234
$result = 22694378
除以10^6 即是 22.694378 , 北纬 22.69°附近