Andriod | Byte和String的相互转换

核心: 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.截取字符

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

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

推荐阅读更多精彩内容

  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
    王震阳阅读 79,557评论 26 513
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    会飞的鱼69阅读 2,108评论 1 44
  • 概述 java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。java.io ...
    Steven1997阅读 3,055评论 1 16
  • 我什么都不行,大学混过去了,什么都没找到也没学到
    肥婆的书桌阅读 27评论 0 0
  • 文/李子默 –1– 我有一个很可爱的女朋友,她个子不高,微胖,小圆脸肉肉的,捏上去很舒服。 用一个词形容就是……蠢...
    李子默_阅读 1,178评论 34 34