信号板拼包:数组方式(bug长度只是截短,并未清空,若之后拷贝数据长度小于之前数据长度,老数据会接在后面)
class SignalobardMsgReadHandler : public SessionVectChar::ReadHandler
{
public:
SignalobardMsgReadHandler() = delete;
SignalobardMsgReadHandler(SignalobardMsgReadHandler _in v) = delete;
SignalobardMsgReadHandler(sNetPack * _in data_ptr, size_t _in package_size = sizeof(sNetPack) )
: last_time_(bzrobot::Now())
, data_ptr_(data_ptr)
, package_size_one_(package_size)
, package_check_sum_(0)
, cache_buffer_size_(0)
, cache_buffer_()
{
}
virtual ~SignalobardMsgReadHandler()
{
}
inline int GetPackHeadFirstIndex( char buffer[], int one_package_size, unsigned char package_head_value )
{
int continue_equal_times = 0;
for ( int i = 0; i < one_package_size; ++i )
{
if ( (unsigned char)buffer[i] == package_head_value )
{
++continue_equal_times;
if ( continue_equal_times == PackageHeadByte_ )
{
return (i-(PackageHeadByte_-1));
}
}
else
{
continue_equal_times = 0;
}
}
return -1;
}
unsigned short CalculateCheckSum ( char buffer_[], int package_size )
{
unsigned short check_sum = 0;
for ( int i = 0; i < package_size-2; ++i )
{
check_sum += (unsigned char)buffer_[i];
}
return check_sum;
}
bzrobot::Duration _rt BlankTime() const
{
return bzrobot::Now() - last_time_;
}
protected:
bzrobot::Result _rt RunMain(typename SessionVectChar::ReadHandler::OutputType _ut output,
typename SessionVectChar::ReadHandler::InputType _in input,
typename SessionVectChar::ReadHandler::OptionType _in option) final
{
last_time_ = bzrobot::Now();
if(!data_ptr_)
{
return BZROBOT_SIGNAL_BOARD_MSG_ERROR;
}
TO_2_BYTE WORDtemp;
const std::vector<char>& input_data = input;
//存包,然后根据包长决定是否取包,多包时取用最新包
memcpy ( &cache_buffer_[cache_buffer_size_], input_data.data(), input_data.size() );
cache_buffer_size_ = cache_buffer_size_ + input_data.size();
//只要缓存长度大于单个包长度,即循环进行取包,以防缓存数据堆积
while ( cache_buffer_size_ >= package_size_one_ )
{
//获取数据包头在缓存中的位置
int pack_head_index = GetPackHeadFirstIndex ( cache_buffer_, package_size_one_, PackageHeadValue_ );
//未找到包头,丢弃该部分,返回等待新的接收数据
if ( pack_head_index == -1 )
{
BZROBOT_WARNNING("SiganlBoardMsg: Not find pack head index");
cache_buffer_size_ = cache_buffer_size_ - ( pack_head_index + package_size_one_ );
return BZROBOT_SIGNAL_BOARD_MSG_ERROR;
}
//找到包头,且缓存长度足够取包
if ( pack_head_index + package_size_one_ <= cache_buffer_size_ )
{
memcpy( WORDtemp.b, &cache_buffer_[pack_head_index + package_size_one_ - 2], 2 );
//确认包校验和是否相等:相等取出数据,将取出的包段及其之前的部分丢弃
if ( CalculateCheckSum( cache_buffer_, package_size_one_ ) == WORDtemp.data16 )
{
memcpy(data_ptr_, &cache_buffer_[pack_head_index], package_size_one_);
cache_buffer_size_ = cache_buffer_size_ - ( pack_head_index + package_size_one_ );
}
//确认包校验和是否相等:不相等取出数据,将该包段及其之前的部分丢弃
else
{
BZROBOT_WARNNING("SiganlBoardMsg: Check sum not equal");
cache_buffer_size_ = cache_buffer_size_ - ( pack_head_index + package_size_one_ );
}
}
//找到包头,但缓存长度不够取包,丢弃包头之前的部分
else
{
BZROBOT_WARNNING("SiganlBoardMsg: Not whole package");
cache_buffer_size_ = cache_buffer_size_ - pack_head_index;
}
}
return BZROBOT_SIGNAL_BOARD_MSG_SUCCEED;
}
sNetPack * data_ptr_;
size_t package_size_one_;
size_t cache_buffer_size_;
const unsigned char PackageHeadValue_ = 0xA5;
const int PackageHeadByte_ = 4;
const static int CacheBufferMaxSize_ = 1024;
char cache_buffer_[CacheBufferMaxSize_];
unsigned short package_check_sum_;
bzrobot::Time last_time_;
};
信号板拼包:数组方式(bug长度只是截短,并未清空,若之后拷贝数据长度小于之前数据长度,老数据会接在后面)的更多相关文章
- c语言数据拼包
单片机数据拼包 对于数据包拼包方式常规方式有: 数组 指针 结构体 流 下文将此三种方式分别列举此数据包的实现. 然后对比优缺点. 本文举例数据包协议: 包头 长度Length 消息类型 消息序列号S ...
- Mina框架断包、粘包问题解决方式
Mina框架断包.粘包问题解决方式 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然.也能够提供JAVA 对象的序 ...
- TCP与UDP的不同接包处理方式
TCP与UDP的不同接包处理方式 1.UDP发包的问题问:udp 发送两次数据,第一次 100字节 ,第二次200字节, 接包方一次recvfrom( 1000 ), 收到是 100,还是200,还是 ...
- 数组方式使用jQuery对象
一. 使用jQuery选择器获取结果是一个jQuery对象.然而,jQuery类库会让你感觉你正在使用一个定义了索引和长度的数组.在性能方面,建议使用简单的for或者while循环来处理,而不是$.e ...
- centos7 使用 omnibus包安装方式,安装 gitlab7.4
centos7 使用 omnibus包安装方式,安装 gitlab7.4 1: gitlab是一个开源的软件,类似于github.com那样的git代码管理仓库: 官网 https://about.g ...
- 在centos使用rpm包的方式安装mysql,以及更改root密码
在centos使用rpm包的方式安装mysql,对于centos官方实际推荐使用yum进行安装,下载安装的方式主要用于内网服务器不能连接外网yum源的情况. 下载包 首先根据centos版本在mysq ...
- Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式) 原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 ...
- Thinkphp框架拓展包使用方式详细介绍--验证码实例(十一)
原文:Thinkphp框架拓展包使用方式详细介绍--验证码实例(十一) 拓展压缩包的使用方式详细介绍 1:将拓展包解压:ThinkPHP3.1.2_Extend.zip --> 将其下的 \ ...
- POST请求中参数以form data和request payload形式+清空数组方式
测试与服务端ajax时用的dva封装的request方法,而后端怎么也拿不到参数.结果返现参数在request payload里. HTTP POST表单请求提交时:Content-Typeappli ...
随机推荐
- XML映射文件中关系映射
映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工表: DROP ...
- 记一次虚拟机无法挂载volume的怪异问题排查
故障现象 使用nova volume-attach <server> <volume>命令挂载卷,命令没有返回错误,但是查看虚拟机状态,卷并没有挂载上. 故障原因 疑似虚拟机长 ...
- win7下设置git客户端
msysgit官网: http://msysgit.github.io/ 下载msysgit http://msysgit.googlecode.com/files/Git-1.8.5.2-previ ...
- Spring核心技术(十三)——环境的抽象
本章将描述一下Spring中针对环境的抽象. Environment是一个集成到容器之中的特殊抽象,它针对应用的环境建立了两个关键的概念:profile和properties. profile是命名好 ...
- UOJ 152 汉诺塔 分治
题目链接 题意: 有三根编号为\((1, \, 2, \, 3)\)的柱子,然后第一根柱子上有编号为\(1 \sim n(n \leq 10000)\)的盘子,从上到下第\(i\)个盘子的编号是\(A ...
- HDU 3072 SCC Intelligence System
给出一个带权有向图,要使整个图连通.SCC中的点之间花费为0,所以就先缩点,然后缩点后两点之间的权值为最小边的权值,把这些权值累加起来就是答案. #include <iostream> # ...
- Spring-Boot自定义Starter实践
此文已由作者王慎为授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. disconf-spring-boot-starter 使用方法: 引入maven依赖: <depen ...
- 大数据学习——spark运营案例
iplocation需求 在互联网中,我们经常会见到城市热点图这样的报表数据,例如在百度统计中,会统计今年的热门旅游城市.热门报考学校等,会将这样的信息显示在热点图中. 因此,我们需要通过日志信息(运 ...
- xml编辑无提示?这么破!
在学习testng这个单元测试框架时,如果咱们碰到了编辑测试套件xml,不提示的情况(有提示方便咱们学习,并且testng的测试套件定义必须按照他的dtd文件约束来),咱们可以按照下面的步骤去解决这个 ...
- GBDT 与 XGBoost
GBDT & XGBoost ### 回归树 单棵回归树可以表示成如下的数学形式 \[ f(x) = \sum_j^Tw_j\mathbf{I}(x\in R_j) \] 其中\(T\)为叶节 ...