核心: String和Byte间的相互转换
几行代码,教你最简单的转换, 然鹅,在实际应用过程中,数据的复杂性不只是我们简单的两句话就可以转换了的.那么就来看一下我昨天遇到的问题
需求: 和硬件交互,发过来的报文是byte[]格式, 一个byte[]中包含了几条信息,所以我本地要去根据制定的相关协议去解析.
问题: 传来的byte[]中, 每个信息长度所占字节是我们协议预先设置好的, 但是在实际用的过程中因为字符长短不一, 所以传过来虽然字节长度固定,但是可用字节是无法获取的. 这样一来,直接用new String();转换,会出现如下异常
可以看到,在我们的有效字符后全是乱码, 造成的原因是什么呢?
就是在协议的 byte[]中该字符最长占36个字节. 但实际该字符占20个字节, 这样不足位就会补0 ,也就是所说的\0结束符. 直到补够36个字节. 我循环打印了一下我收到的byte[], 可以看一下
3.png 4.png
后面的0就是造成上述乱码的原因.
解决:
1.熟悉C的人应该觉得这不是什么难事,因为C中提供了一个函数: strcpy. 可以吧从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间.(此函数和图3中System.arraycopy函数类似. 不懂的自行百度. 本文不做过多介绍).
简单的来说就是, C中通过strcpy函数可以自动复制有结束符之前的内容. 但是,我的开发环境是android.所以此路行不通.
2.因为打印出来直观看到的就是0. java中 String提供了个api是 replace. 那可以直接用replace将0替换成其他内容. 我们来试一下;
这样, 后面的乱码问题就解决了. 但是因为是将\0替换成了空格字符,所以后面还有占位,下面就需要用到trim()函数.就可以解决了
简单的概括一下就是: 1.替换 2.去空格
3.既然知道了问题的所在, 那么解决的方法就有很多种. 下面再说一种.
用indexOf('\0'); 函数找出第一个出现结束符的下标, 然后用substring();截取字符就ok了
简单的概括一下就是: 1.找到下标 2.截取字符
至此, 所有问题完美解决.
因为和硬件的交互是不断地,今后可能也会再遇到类似问题,所以写篇文章记录一下.可以随时查阅.
写文章的时候就是又复习了一遍, 日后查阅印象也会更加深刻.好习惯要保持下去.
网友评论