问题

  • 项目为交通大数据相关,使用雷视一体机获取车辆实时信息,通过socket上报给平台
  • 雷达会根据安装点的一个坐标为原点,构建自己的坐标系,记录车辆实时位置
  • 雷达按照一定的通信协议,上报车辆编号、坐标、速度数据等给平台
  • 查看上报数据,发现位置和速度数据异常,与实际情况不符,查看设备原始数据是正常的,应该是数据解析出了问题
  • 重新查看了通信协议,没发现什么问题,咨询了相关同事了解到,为了处理负数,需要按照一定规则解析(文档里没有注明)

解决

  • 我们约定按照字节传输数据,使用了netty,使用io.netty.buffer.ByteBuf接收数据
  • 原有代码片段如下,全部以无符号数解析的:
      realTimeDataPO.vehiclePositionX = (float) 0.1 * buf.readUnsignedShort();realTimeDataPO.vehiclePositionY = (float) 0.1 * buf.readUnsignedShort();realTimeDataPO.vehicleSpeedX = (float) 0.1 * buf.readUnsignedShort();realTimeDataPO.vehicleSpeedY = (float) 0.1 * buf.readUnsignedShort();
  • 实际规则如下:

1.取值范围>=0,按无符号数解析,<0,按有符号数解析
2.长度大于2个字节的,注意大小端字节顺序(否则解析出来的值也不对)
3.注意协议中的备注中说明的单位,如0.1米,那解析的值,再乘以0.1,就是实际的米单位

  • 需要根据值是否为负数,分别使用无符号解析和有符号解析,具体代码如下:
           byte[] vx = new byte[8];buf.readBytes(vx);realTimeDataPO.vehiclePositionX = (float) 0.1 * getShort(vx[0], vx[1]);realTimeDataPO.vehiclePositionY = (float) 0.1 * getShort(vx[2], vx[3]);realTimeDataPO.vehicleSpeedX = (float) 0.1 * getShort(vx[4], vx[5]);realTimeDataPO.vehicleSpeedY = (float) 0.1 * getShort(vx[6], vx[7]);
  • 我们是按照顺序传输数字的,具体byte[]转short代码如下:
    /*** 获取short值* @param low* @param high* @return*/public static int getShort(byte high, byte low) {int result;// 大于等于0,无符号数;小于0,有符号数(为了方便直接使用高位判断了)if (high >= 0) {result = byte2UnsignedShort(low, high);} else {result = byte2Short(low, high);}return result;}/*** byte[2] 转 unsignedShort** @param low* @param high* @return*/public static int byte2UnsignedShort(byte low, byte high) {return (high << 8 | low);}/*** byte[2] 转 short** @param low* @param high* @return*/public static short byte2Short(byte low, byte high) {return (short) ((low & 0xFF) | (high << 8));}
  • 这样取的数据,已经没问题了,与设备里的原始数据一致,部分打印如下:

字节数组byte[]转有符号short和无符号unsignedShort相关推荐

  1. 字节数组byte[]和整型,浮点型数据的转换——Java代码

    近期在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输.须要从字节数组还原数据,查了一些资料.总结例如以下 1.       整数和浮点数的机器表示 在机器内部.不 ...

  2. Java字节数组byte b[]与byte[] b

    Java中的字节数组 Java字节数组仅用于存储字节数据类型值.字节数组中元素的默认值为0. 通过以下Java字节数组示例,您可以学习 如何声明Java字节数组? 如何为Java字节数组分配值? 如何 ...

  3. c#中字节数组byte[]、图片image、流stream,字符串string、内存流MemoryStream、文件file,之间的转换

    字节数组byte[]与图片image之间的转化 字节数组转换成图片 public static Image byte2img(byte[] buffer) {MemoryStream ms = new ...

  4. C#中字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  5. C#字节数组(byte[])和字符串相互转换

    转换过程主要使用到System.Text.Encoding命名空间下的类 1. 字符串转换成字节数组byte[]: string str = "This is test string&quo ...

  6. 负数时的有符号整型和无符号整型的转换

    目录 一.补码 二.负数时的有符号整型和无符号整型的转换 三.关于无符号的笔试题 一.补码 有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1 例如:有符号数 1000 0011,其 ...

  7. C语言中无符号整型变量赋值负数,负数时的有符号整型和无符号整型的转换

    目录 一.补码 二.负数时的有符号整型和无符号整型的转换 三.关于无符号的笔试题 一.补码 有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1 例如:有符号数 1000 0011,其 ...

  8. 有符号拓展:signed-extending无符号拓展:unsigned-extending

    符号拓展 拓展意义 举个栗子 有符号拓展:signed-extending&无符号拓展:unsigned-extending 拓展意义 符号拓展的意义是产生位数拓展,数值不变的的结果.常见于不 ...

  9. C语言 有符号类型转换为无符号类型

    C语言中变量的类型变换比较多,有些地方需要时刻注意,不然很可能写出带有bug的代码并深埋入系统,难以察觉. 例如 有符号类型和无符号类型运算,有符号类型转换为无符号类型. 需要注意的有两种情况: 1. ...

最新文章

  1. mysql表文件被删_mysql表物理文件被误删的解决方法
  2. WEB中get请求和post请求的区别
  3. WIN10 OpenGL GLFW+GLAD 开发环境搭建
  4. MESSAGE_TYPE_X dump in RSM_DATASTATE_CHECK -6-
  5. access窗体中再制作查询窗体_Access
  6. InetAddressSocket使用总结
  7. 4g模块注册上网 移远_Openwrt支持移远4G模块过程记录
  8. cgi+bin+php,crontab+php-cgi/php 定时执行PHP脚本
  9. PHP语言 -- Ajax 查询数据
  10. 第一个Win32 SDK应用程序
  11. java structs hibernate php_eclipse+hibernate+structs 环境搭建
  12. JavaScript警告框中的新行
  13. hdu 1011 Starship Troopers (树形背包dp)
  14. android 虚拟经纬度_Android原生方式获取经纬度
  15. 对象的序列化与反序列化Demo
  16. 设计模式之 Factory Mode 工厂模式:Swift 实现
  17. [文献翻译自用]运用本地差分隐私的基于物品的协同过滤
  18. 海康sdkC++二次开发之回放下载
  19. 信息论领域内的计算方法仿真,Mutual Information,互信息;
  20. CentOS7安装mysql5.7.19的手顺,步骤(非常详细)

热门文章

  1. 国庆 深圳游玩 路线规划之南山区
  2. 华为交换机和锐捷交换机端口隔离
  3. VCF | 多等位基因位点如何拆分?InDel变异如何标准化?
  4. win10去除桌面快捷方式小箭头
  5. javascript学习-canvas
  6. 基于“二元”分析法的企业信息管理的架构:“三个Table的ERP”
  7. python——餐饮数据分析
  8. 智能城市dqn算法交通信号灯调度_交通信号灯毕设论文(A).doc
  9. 超详细Redis入门教程——Redis命令(下)
  10. java 监控系统cpu,java系统监控CPU 磁盘