美文网首页
Andriod | Byte和String的相互转换

Andriod | Byte和String的相互转换

作者: l王小一 | 来源:发表于2018-11-21 15:58 被阅读0次

    核心: String和Byte间的相互转换

    1.png
    几行代码,教你最简单的转换, 然鹅,在实际应用过程中,数据的复杂性不只是我们简单的两句话就可以转换了的.那么就来看一下我昨天遇到的问题

    需求: 和硬件交互,发过来的报文是byte[]格式, 一个byte[]中包含了几条信息,所以我本地要去根据制定的相关协议去解析.

    问题: 传来的byte[]中, 每个信息长度所占字节是我们协议预先设置好的, 但是在实际用的过程中因为字符长短不一, 所以传过来虽然字节长度固定,但是可用字节是无法获取的. 这样一来,直接用new String();转换,会出现如下异常

    2.png
    可以看到,在我们的有效字符后全是乱码, 造成的原因是什么呢?
    就是在协议的 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替换成其他内容. 我们来试一下;

    5.png 6.png

    这样, 后面的乱码问题就解决了. 但是因为是将\0替换成了空格字符,所以后面还有占位,下面就需要用到trim()函数.就可以解决了

    简单的概括一下就是: 1.替换 2.去空格

    3.既然知道了问题的所在, 那么解决的方法就有很多种. 下面再说一种.
    用indexOf('\0'); 函数找出第一个出现结束符的下标, 然后用substring();截取字符就ok了

    简单的概括一下就是: 1.找到下标 2.截取字符

    至此, 所有问题完美解决.

    因为和硬件的交互是不断地,今后可能也会再遇到类似问题,所以写篇文章记录一下.可以随时查阅.
    写文章的时候就是又复习了一遍, 日后查阅印象也会更加深刻.好习惯要保持下去.

    相关文章

      网友评论

          本文标题:Andriod | Byte和String的相互转换

          本文链接:https://www.haomeiwen.com/subject/arecqqtx.html