一个朋友 最近在做一个 硬件相关的项目。搞Web的,最擅长的也是最熟悉的 PHP来开发,使用了 workerman 框架。搞WEB的平常很少和 二进制打交道,他看到 文档 开头就蒙圈了。向他的大神(也就是我)来求救了。下面是 部分文档的截图,第一次看时 简直 头大阿。

我也很少 和 二进制打交道,作为”大神”的我,怎么能在”迷弟”面前表现出不会呢,只能硬着头皮上了,折腾了一晚上,终于造出来一个小轮子。代码已经测试没有问题了,另外 为了 让 这朋友 更加崇拜我,完成后,特意美化了一下代码。。。

直接写成了类,方便 整合,代码如下:

/**

* 类名:BufferService

* 作者:mqycn

* 博客:http://www.miaoqiyuan.cn

* 源码:http://www.miaoqiyuan.cn/p/php-buffer

* 说明:一个简单的PHP协议校验类

*/

class BufferService {

private static $debugMode = false;

private static function debug($fun, $info, $debug = null) {

if ($debug === null) {

$debug = self::$debugMode;

}

if ($debug === true) {

echo str_replace(' ', '&nbsp', "[$fun]:$info
");

}

}

//数字 转 Buffers[] (之前的方法)

public static function number_to_buffer($number, $debug = false) {

if ($number < 0xff) {

self::debug('number_to_buffer', "数字" . $number . '小于256 计算:' . $number, $debug);

//如果小于一个字节,输出

return array($number);

}

self::debug('number_to_buffer', "准备分析数字" . $number, $debug);

$remainder = $number % 0x100;

$quotient = ($number - $remainder) / 0x100;

self::debug('number_to_buffer', " 余数:" . $remainder, $debug);

self::debug('number_to_buffer', " 整商:" . $number, $debug);

$arr = self::number_to_buffer($quotient, $debug);

if ($remainder < 0) {

throw new Exception('数字溢出(' . $number . ')');

}

$arr[] = $remainder;

return $arr;

}

//二进制 求 ck_sum (也是之前的)

public static function buffer_ck_sum($buffers = array()) {

$ck_sum = 0;

for ($pos = 0; $pos < count($buffers); $pos++) {

self::debug('buffer_ck_sum', '第' . ($pos + 1) . '次计算求值');

self::debug('buffer_ck_sum', ' 计算前:' . $ck_sum . ', ' . self::number_to_hexstring($ck_sum));

$ck_sum += $buffers[$pos];

self::debug('buffer_ck_sum', ' 计算后:' . $ck_sum . ', ' . self::number_to_hexstring($ck_sum));

$ck_sum = $ck_sum % 0x100;

self::debug('buffer_ck_sum', ' 求余后:' . $ck_sum . ', ' . self::number_to_hexstring($ck_sum));

}

$ck_sum = 0xff - $ck_sum;

self::debug('buffer_ck_sum', '最终结果:' . $ck_sum . ', ' . self::number_to_hexstring($ck_sum));

return $ck_sum;

}

// Buffers[] 转 hex (还是原来的,写到函数里)

public static function buffer_to_hexstring($buffers = array()) {

$hex = '';

$hex_string = '';

foreach ($buffers as $val) {

$hex = dechex($val);

$hex_string .= strlen($hex) > 1 ? $hex : '0' . $hex;

}

return '0x' . strtoupper($hex_string);

}

// 通过HEX字符串 转 Buttfer[]

public static function hexstring_to_buffer($str) {

$buffers = array();

for ($pos = 0; $pos < strlen($str); $pos += 2) {

$buffers[] = hexdec(substr($str, $pos, 2));

}

return $buffers;

}

// 通过数字转换成 HEX字符串

public static function number_to_hexstring($number, $debug = false) {

$buffers = self::number_to_buffer($number, $debug);

return self::buffer_to_hexstring($buffers);

}

// 获取输入参数

public static function get_input($input) {

if (is_array($input)) {

$buffers = $input;

} elseif (is_string($input)) {

$buffers = self::hexstring_to_buffer($input);

} elseif (is_numeric($input)) {

$buffers = self::number_to_buffer($input);

}

return $buffers;

}

// 通过输入项目获取 ck_sum

public static function get_ck_sum($input, $debug = null) {

self::$debugMode = $debug;

$buffers = self::get_input($input);

self::debug('get_ck_sum', '转换成HEX字符串:' . self::buffer_to_hexstring($buffers));

return self::buffer_ck_sum($buffers);

}

// 判断输入的数据是否通过校验

public static function is_ck_sum($input, $debug = false) {

self::$debugMode = $debug;

$buffers = self::get_input($input);

$ck_sum = self::get_ck_sum(array_slice($buffers, 0, count($buffers)-1), $debug);

return $ck_sum == $buffers[count($buffers) - 1];

}

}

使用非常简单,引用类后,直接通过 静态方式调用即可。

require_once('BufferService.class.php');

//显示 数字转HEX计算过程

$hex_string = BufferService::number_to_hexstring(10597059, true); //0xA1B2C3

echo '
通过数字转HEX字符串: ' . $hex_string . '


';

//传入数字方式计算 ck_sum,并显示计算过程

$ck_sum = BufferService::get_ck_sum(105970, true); //0xA1B2A

echo '传入数字方式 最终结算结果: ' . BufferService::number_to_hexstring($ck_sum) . '


';

//通过二进制流计算sum

$buff = array(

0xF0, 0x86, 0x8D, 0xBA,

0x35, 0x3D, 0x10, 0x03,

0x00, 0x6C, 0x67, 0xF6,

0x35, 0x3D, 0x10, 0x03,

0x00, 0x6C, 0x67, 0xF6,

0x35, 0x3D, 0x10, 0x03,

0x00, 0x6C, 0x67, 0xF6,

0x35, 0x3D, 0x10, 0x03,

0x00, 0x6C, 0x61, 0x46

);

$ck_sum = BufferService::get_ck_sum($buff);

echo 'Buffer方式 array(' . join($buff, ',') . ') 最终结算结果: ' . BufferService::number_to_hexstring($ck_sum) . '


';

$buff[] = 0xC0;

echo 'Buffer判断是否通过校验 array(' . join($buff, ',') . ') : ' . (BufferService::is_ck_sum($buff) ? '通过' : '未通过' ) . '


';

//通过HEX字符串计算sum

$hex_string = "7A78183A777922B57A7A7817A78183A777922B57A7A78183A777922B578183A7779229383A777922B5EF";

$ck_sum = BufferService::get_ck_sum($hex_string);

echo "HEX字符串方式 $hex_string 最终计算结果: " . BufferService::number_to_hexstring($ck_sum) . '


';

$hex_string .= '0B';

echo "HEX字符串 判断是否通过校验 $hex_string: " . (BufferService::is_ck_sum($hex_string) ? '通过' : '未通过' ) . '


';

$hex_string = BufferService::number_to_hexstring(0x7A78183A777922B7A78183A777922B5); // 异常处理:溢出

数字转HEX计算过程,后续创建token可以用到。另外所有的数字转换回 HEX字符串也会用到

传入数字方式计算 ck_sum,并显示计算过程

通过二进制流方式计算sum和验证和传入的数据是否可用

通过HEX字符串计算sum和校验结果是否能通过

防止因为传参错误,导致 溢出,计算出错误的 ck_sum,支持异常处理

php 多选的 二进制,PHP二进制操作初体验相关推荐

  1. linux基本命令打开文件,Linux系统操作初体验 通过命令打开txt文件编辑并保存退出...

    在以往白天使用的服务器都是Windows的,操作简单几乎不用在网上找教程就能搞定一个网站从环境搭建到上线所有的动作.就在上周,白天总算也是下定决定使用图1 Linux系统操作 废话不多说,下面白天就来 ...

  2. java 树 广度优先遍历_Java二进制搜索树遍历操作的详细描述[前,中,后,层次,广度优先遍历]...

    本文介绍了Java二进制搜索树遍历操作. 与您分享以供参考,如下: 前言: 在Java Binary Search Tree Basics的上一节中,我们了解了该树及其相关知识,并对Binary Se ...

  3. oracle 二进制算法,二进制搜索(查找)

    二进制搜索(二进制查找)是一个非常快的搜索算法.这种搜索算法适用于分裂和治之的原则.对于该算法正确工作数据收集应是有序的形式. 二进制搜索通过比较集合的中部项目来搜索的特定项目.如果出现匹配,那么返回 ...

  4. 计算机 二进制 中国,二进制与计算机

    二进制与计算机事物的多少或者顺序,我们可以用一种称为"数"的符号来表示.事物的数量是无穷的,我们却不可能创造无数个符号.为了解决这个难题,人们创造了进位制(又叫做位值制),这样就可 ...

  5. java中各进制之间的转换(十进制转十六进制、十进制转二进制、二进制转十进制、二进制转十六进制)...

    在java编辑中有没有遇到经常需要进行java中各进制之间的转换(十进制转十六进制.十进制转二进制.二进制转十进制.二进制转十六进制)的事情呢?下面我们就来分析一下各自是怎么转换的: [java] / ...

  6. layui复选框:被js操作checked切换并显示状态(含案例、代码)

    文章目录 layui复选框:被js操作checked切换并显示状态 (含案例.代码) 案例 · 应用 · 截图: 案例 · 代码: 背景 · 设置: 使用说明: layui复选框:被js操作check ...

  7. VB 进制转换大全(十进制、十六进制、八进制、二进制、二进制流)互转

    模块包含了下面的各种转换: 二进制转十进制 二进制转化为八进制 二进制转化为十六进制 八进制转化为十进制 八进制转化为二进制 八进制转化为十六进制 十进制转二进制 十进制转化为八进制 十进制转化为十六 ...

  8. 计算机操作员有关大学专业,如何根据自身特长选大学专业,这样操作最简单直接!...

    原标题:如何根据自身特长选大学专业,这样操作最简单直接! 点击图片,即可快速预约 很多考生对专业的选择往往手足无措,不知道报什么专业,更不知道从哪些方面考虑专业方向.这里有一句话:"本科看学 ...

  9. 关于二进制兼容(二进制边界)的解释

    二进制兼容 二进制兼容是针对动态链接库而言的,如果你的源代码已经编译成为可执行文件了,其中你调用了一些动态库,后来你为这个动态库进行了更新,并替换掉原来的动态库了,如果程序在运行时正常运行没有任何问题 ...

最新文章

  1. 列表CheckBox全选 结合DataGrid 进行删除操作
  2. Asp.Net 之 抓取网页内容
  3. (jQuery,Highcharts)前端图表系列之一 --Highcharts (转)
  4. excel实战应用案例100讲(十三)-使用Python 对 Excel文件进行批量操作
  5. mysql索引久了需要重新_mysql索引更新要多久
  6. HDU 2588 GCD amp;amp; GCD问题总结
  7. 驰骋工作流-表单设计-从表多表头-功能讲解
  8. 对称式加密与非对称式加密的对比
  9. 利用requests模块爬取小说
  10. 基于Spring Boot 2 和 Vue.js 2 的 食品科学与工程学院网站的设计与实现
  11. 八月暑期福利,10本Python热门书籍免费送!
  12. easyexcel一个很棒的Excel解析工具
  13. 为什么要用同花顺程序化交易接口?
  14. DQN-[Playing Atari with Deep Reinforcement Learning]
  15. ExecuteNonQuery方法和ExecuteScalar方法的区别
  16. 30套最实用JAVA学习视频教程合集
  17. Apache HttpClient
  18. python爬取猫猫图
  19. draft伦理第三章
  20. 魅族flashfire_魅族Pro6s更新安卓7.1后完美root及xp框架

热门文章

  1. 将图片的每个像素进行分类
  2. python运算符重载例子
  3. 代码荣辱观-以运用风格为荣,以随意编码为耻
  4. 一个JS打开链接并隐藏来源的方法
  5. 云计算将成为媒体融合发展与数字化变革的加速剂
  6. win7硬盘安装ubuntu双系统——注意项
  7. 十厂商发起成立软件自律联盟
  8. BS-XX-020基于SSM实现停车位租赁系统
  9. MySQL Workbench建表时 PK NN UQ BIN UN ZF AI Default 的含义
  10. 特来电监控引擎流计算应用实践