我获取了八字节的报文数据区,还知道startbit、length和编码类型,如何方便地把数据拿出来呢?
一般而言,这项工作不需要用户自己做,毕竟现在的成熟工具,基本上都能自己实现,比如TSMaster、PCAN Explorer、CANoe等等。 但是,特定情况下,这个技能还是非常有用的,特别是牵涉到诊断、自定义工具、基于数据库的控制等等,成熟工具可能买不到,就需要自己动动手了。01
挖取数据
确定输入参数
师子一号掐指一算,觉得只需要4个参数就行了,如下图所示:
![2587a73927f0209309d37c4b18d8bc3d.png](https://i-blog.csdnimg.cn/blog_migrate/6b16dfef8cb2b69ea0754d1ea0b5cd42.jpeg)
在上图中,payload中的位值,应该是布尔,但是布尔不好区分,本文为了方便讲解,直接用互不相同的数值(这些数值实际上是该bit的表示位置)替换这些布尔,等文章讲到最后,再替换回来。
缩小目标
根据上图示例中的参数值,我们的目标是,把下图所示区域的序列值拿出来。
![666e0c3eee24fd440e1ba5e2a92d7899.png](https://i-blog.csdnimg.cn/blog_migrate/2335a97be7f11ea8705de5eb2699bea8.jpeg)
拼接成下图所示的序列:
![b001cf8dd6f7ab7414cd47a8233e52db.png](https://i-blog.csdnimg.cn/blog_migrate/30e9e7436d19441157d9dbea6a1a441f.jpeg)
然后根据该位置的实际布尔值,将其转换成整形数据即可。
师子一号见过形形色色的挖数据的方法,有移位法,有切割拼接法,还有其他的多种方法,但是,如果论哪个效率最高、最简单,还数接下来我给大家演示的这个办法。
程序框图第一步,拼成长数组
![acbf5c172b1996ef0fd554db60a9b969.png](https://i-blog.csdnimg.cn/blog_migrate/3059eaef241833190d71078d0e6f6423.jpeg)
拼接长数组的目的是,把二维变一维。
拼接之后您会发现,我们的目标数据区,变成了一段连续的数据了,如上图蓝色圆圈所示。
接下来呢,因为目前的startbit指的是最右边的“34”,所以我们还要做个“索引变换”,把它变成最左边的“22”,然后用常规的数组索引方式就可以获取数据了,如下图所示:
![78d0a84917532fb5deee7a3cff3f6327.png](https://i-blog.csdnimg.cn/blog_migrate/d0a29d01df787f6cfac5329568bc1d2d.jpeg)
ok,点一下run,数据就出来啦,非常简单!
咦?好像哪里不对
额,上面的例子没有用到“编码类型”参数,我们只考虑了motorola编码格式,那intel编码格式应该怎么办呢?
如果payload、startbit、length均不变,只是把编码类型从motorola改成了intel,那么,我们的目标数据区应该是如下图所示:
![3af059855eb3ec214f6f2aca1f6e844d.png](https://i-blog.csdnimg.cn/blog_migrate/8eaeabdc97353cd65c928e9572875f6b.jpeg)
目标数据序列应该为:
![988a521c75e20620f97b4dd404a85bca.png](https://i-blog.csdnimg.cn/blog_migrate/22eaeff0c8d8b88d6796aa986eda342b.jpeg)
![d4d46b96c2f7fb72752bc2a26e7254a6.gif](https://i-blog.csdnimg.cn/blog_migrate/0832f6c58dab02784080e310480d5069.gif)
![07d14220a14b76baf3f372e4148e8f46.png](https://i-blog.csdnimg.cn/blog_migrate/524a251e1518338749ee5bb88a254903.jpeg)
![1e57cd36341641e98b735042f5293694.png](https://i-blog.csdnimg.cn/blog_migrate/bd7868aea52157bbea592928b0f5fe1e.jpeg)
![83f586e277ad46a197e4f7226ba50f30.png](https://i-blog.csdnimg.cn/blog_migrate/f2b55eacd720d0e8c281793eaaf4d305.png)
![e9b9fa2d42c3c6f31902ca7e1f37882a.png](https://i-blog.csdnimg.cn/blog_migrate/e1e86ecce956b86932f145225c36fc4f.jpeg)
02
填充数据
有时候,我们需要的不仅是读取数据,还需要写入填充数据,把某个序列填充到特定的位置,该咋办呢?
非常简单,把第一章节的过程逆过来就行了。
先根据物理值计算出布尔序列,然后替换掉DATA所转换的布尔长数组目标区域,再转换成二维布尔数组,再转换成DATA的数据就可以了。
大家可以自己尝试下,真的不难的~
03
小结
文章到了末尾,还是建议大家使用现成的成熟工具,能用现成的就用现成的,节省时间,更能出成绩、多干活,比如上海同星的TSMaster,广州虹科的进口产品等等。
如果没有现成工具,那么,如果能拿到源码,就尽可能在别人的基础上做,可以节省不少时间。如果拿不到源代码,那么,照着别人的经验讲解来做,也是个不错的选择!
如果有朋友需要本文的源码(包括intel、motorola的读取和写入),欢迎在本文留言,然后邀请朋友对您的留言点赞,文章推送当天需要20个赞,以后每天增加5个。
【推荐阅读】![6a4425a24597d93dcefb66fcb91b0ccf.gif](https://i-blog.csdnimg.cn/blog_migrate/4d6dbef7f4b1ac72b35665357f6b789c.gif)