前言

距离上一次博客已经过去很久了,原因有三

  • 其一:上一篇即将完成的博客未手动保存,系统亦未自动保存 导致热情降低
  • 其二:国庆小假期放飞自我
  • 其三:当前项目遇阻,进展缓慢

当前问题

说一说最近遇到的问题,之前实现了 Android 低功耗蓝牙的使用,为接入现有项目,需将数据先封装为 ModBus_RTU 协议帧,再通过蓝牙协议将 ModBus_RTU协议帧 透传至从机

项目整体架构如下:

熟悉嵌入式开发的朋友应该对 INT8UINT16U 等类型非常熟悉,它们分别代表的是 8位无符号整型,16位无符号整型。

既然是 8位/16位,首先想到的办法就是在 Java 中找到同字节的数据类型去替代使用

我选择的是 byte short 

随后注意到 Java 的基础数据类型中居然没有无符号类型(char 除外),而透传模块传输过来的数据是无符号的

类型 默认值 占用存储空间  范围 范围说明
byte 0 1byte(8bit) -128~127 -2 的 7 次方到 2 的7次方 - 1
short 0 2byte(16bit) -32768~32767 -2 的 15 次方到 2 的 15 次方 - 1
int 0 4byte(32bit) -2147483648~2147483647 -2 的 31 次方到 2 的 31 次方 - 1
long 0 8byte(64bit) -9223372036854774808~9223372036854774807 -2 的 63 次方到 2 的 63 次方 - 1
float 0.0 4byte(32bit) 3.402823e+38 ~ 1.401298e-45 e+38 表示是乘以 10 的 38 次方,同样,e-45 表示乘以 10 的负 45 次方
double 0.0 8byte(64bit) 1.797693e+308~ 4.9000000e-324  
char 2byte(16bit) \u0000~\uFFFF char 类型变量是用来存储 Unicode 编码的字符,可以存储一个汉字,汉字在 Unicode编码中占用两个字节
boolean FALSE 1byte(8bit) false、true  

关于 char 的编码,可以看看阮一峰老师的 字符编码笔记

那么蓝牙通讯时,协议封装和解析时就要特别注意到有符号数据和无符号数据之间的转换

否则可能出现以下情况:

Android 端接收到 INT8U 数据255(0xFF),若直接将一个 byte 变量赋值为0xFF,则将被 Java 解析为 -1。这种结果当然是我们不愿意看到的。

解决方法

接收数据时(无符号数据 ---> 有符号数据)

当前解决方法是在 Java 中用更高的存储数据类型

例如 需要接收 INT8U 数据,则需在 Java 中使用 16+bit 数据存储例如 shortint...

//Android 蓝牙接收到 byte[],byte[0] = 0xFF = 255(无符号数据)
byte a = (byte)0xFF;System.out.println(UINT8toRead(a));//...public int UINT8toRead(byte a)
{//部分编译器会把最高位当做符号位,因此写成 0x0FFint read = a & 0x0FF;//read = a;//read = (read<<8)>>>8;return read;
}

0xFFJava 会被解析为 int 数据,因而

& 操作在这里返回的结果是一个 int 类型(int & byte)

<<  是左移

>>>  是无符号右移

结果:

此外我们还可以使用 Guava ,参见

Google Guava 快速入门 —— 原生类型工具类

Google Guava 的 5 个鲜为人知的特性

发送数据时(有符号数据 ---> 无符号数据)

同样以 8位数据 为例,例如需要发送 255,那么协议中使用 byte 进行存储,如何操作?

//待发送数据为255
int write = 255;System.out.println(WritetoUINT8(write));//...public byte WritetoUINT8(int write)
{//在协议中该数据保存为byte abyte a = (byte)(write & 0x0FF);return a;
}

结果:

查看其二进制编码:

8bit 无符号类型中, 0xFF 将被解析为 255

Java 无符号数据类型处理相关推荐

  1. Java无符号数据类型

    Java不支持无符号数据类型.byte,short,int和long都是有符号数据类型.对于有符号数据类型,值范围的一半存储正数,一半用于负数,因为一个位用于存储有符号值的符号. 例如,一个字节需要8 ...

  2. java int 无符号_Java 无符号数据类型

    Java数据类型教程 - Java无符号数据类型 Java不支持无符号数据类型. byte,short,int和long都是有符号数据类型. 对于有符号数据类型,值范围的一半存储正数,一半用于负数,因 ...

  3. java 无符号整型_Java-java中无符号类型的处理

    在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换. 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre ...

  4. 负数转换为无符号数据类型的理解及应用

    负数转换为无符号类型数据的理解及应用 负数转换为无符号数据类型的理解及应用 有符号整型和无符号整型的转换 有符号类型和无符号类型的转换应用实例 参考文献 负数转换为无符号数据类型的理解及应用 网上有大 ...

  5. C的无符号数据类型int,short,byte 转为 Java对应的数据long,char,short

    //从网络中读取C的无符号int,short,byte字节数组,相应转换成java的long,char,short short anUnsignedByte = 0; char anUnsignedS ...

  6. java 无符号转有符号_java有符号无符号的转换

    数据处理中常常遇到基本数据类型的操作,java都是有符号的数据,而与下位机通信中常常遇到无符号的比如uint8, uint16,uint32等等 1.为了完成这个功能还专门采用ByteBuffer的方 ...

  7. java 无符号 类型_java中符号类型和无符号类型的问题分析

    一 参考博文 二 java中的无符号数和有符号数 在计算机中,可以区分正负的类型,称为有符号类型,无正负的类型,称为无符号类型. 使用二进制中的最高位表示正负 计算机中用补码表示数值:另外,用二进制的 ...

  8. java 无符号右移_java中的无符号移位运算

    1. 无符号右移   >>>  或 >>> = 无符号右移(>>>)跟右移(>>)运算符不一样. 右移不改变数的正负. 对于一个正数, ...

  9. plc位、字节、字、双字、有符号、无符号数据类型的关系

    plc位.字节.字.双字.有符号.无符号的关系 以下内容由深圳市综科智控科技开发有限公司编辑整理 2021/08/18 前言:很多同学在PLC开发过程中,因为数据类型选择错误而出现得到的数据和期望的数 ...

最新文章

  1. 2022-2028年中国煤制甲醇产业投资分析及前景预测报告
  2. LeetCode简单题之到目标元素的最小距离
  3. Serverless 解惑——函数计算如何访问 SQL Server 数据库
  4. 定时修改列表 服务器版,Unity定时回调(服务端不依赖Update)
  5. 进行有效编辑的七种习惯
  6. ​std::multimap
  7. 关于工业级RS485串口服务器的组网方式详解
  8. 小程序 | 微信小程序多图上传(点击上传、可修改删除与放大回显)
  9. java在线支付---13.java在线支付所有源码:
  10. 好朋友,记得要经常联系
  11. 如何提高实景三维智慧城市项目的建模精度和建模效果
  12. 接口测试系列:工作中所用(十:配置文件的读写操作 configparser模块)
  13. C#图片处理(裁剪,缩放,清晰度,水印)
  14. android mtklog,Mtklog结构及分析
  15. docker安装gamit_科学网—ubuntu下安装gamit 安装 - 贺小星的博文
  16. java duplicate key_Stream 操作 Duplicate key问题
  17. 医学图象存储、检索和显示的新技术及新动向
  18. 用计算机打爸爸妈妈,打破限制,我们可以这样远程教父母用手机,向日葵UUPro真香...
  19. word目录编号自动更新排版技巧
  20. 域名注册需要哪些条件?需要提交哪些材料?

热门文章

  1. win10专业版-开机自动连接宽带
  2. 高德、腾讯、百度实时路况切片地址
  3. python 创建一个空向量_python 创建一维的0向量实例
  4. SiC肖特基的电流密度提高了50%,浪涌额定值也提高了50%
  5. 关于html5好的10本书,让你推荐人生必看的10本书,你会推荐哪几本?
  6. r语言 林元震_方差分析--T检验和F检验的异同
  7. BugkuCTF-WEB-网站被黑
  8. 权益对账稽核该怎么做
  9. 浅谈服务治理、微服务与服务网格(Service Mesh)
  10. php 正则表达式不包含,不包含特定字符串的php正则表达式