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

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

因为和硬件的交互是不断地,今后可能也会再遇到类似问题,所以写篇文章记录一下.可以随时查阅.

写文章的时候就是又复习了一遍, 日后查阅印象也会更加深刻.好习惯要保持下去.

android byte转字符串,Andriod | Byte和String的相互转换相关推荐

  1. 几种字符串到byte[] 数组转化为String 的方法

    < language="javascript" src="/ad/js/edu_left_300-300.js" type="text/java ...

  2. iOS -- 十进制、十六进制字符串,byte,data等之间的转换

    十进制->十六进制 Byte bytes[]={0xA6,0x27,0x0A}; NSString *strIdL = [NSStringstringWithFormat:@"%@&q ...

  3. 串口开发,数据类型转换——字符串转 byte[],byte[]转二进制,二进制转十进制转byte[],byte[]转十进制,byte[]拼接,校验

    bytez转String /*** 字节数组转换成对应的16进制表示的字符串** @param src* @return*/ public static String bytes2HexStr(byt ...

  4. android调用.Net WebService传递byte[]

    android调用.Net WebService传递byte[] android端代码: SoapObject request = new SoapObject(Constant.NAMESPACE, ...

  5. C#中如何将字符串转换byte[],同时如何将byte[]换成字符串?

    C#中如何将字符串转换byte[],同时如何将byte[]换成字符串? 博客分类: C# CC++C#  1   string   to   byte  []   string   str   =   ...

  6. java字符串字节_Java中字符串与byte数组之间的相互转换

    前言 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成byte数组型,java在字符与数组转换也是非常方便的.下面跟我一起来了解一下字符串与byte之间转换的原理 ...

  7. 二进制样式的字符串与byte数组互转函数示例

    开发时用到的方法,记录下: /// <summary>/// 测试方法 /// </summary>private void TestFun(){Response.Write( ...

  8. 十六进制字符串与byte数组与ASCII码互相转换

    日常工作中,对接一些硬件使用tcp通信,需要将输入输出流转16进制字符串再在表中找到与其对应的ASCII码,并转换作为结果.因此,这里整理了一个工具类,用于这三者的相互转换. 十六进制字符串转byte ...

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

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

最新文章

  1. BZOJ1922: [Sdoi2010]大陆争霸
  2. 孤儿进程与僵尸进程[总结]
  3. 中国半光漆市场需求前景与投资规划研究报告2021年版
  4. hdu 1532(最大流)
  5. 把html追加到指定id后面,javascript – jQuery,动态追加元素时增加id号
  6. EOS page问题
  7. DXperience,不能不爱
  8. 11. OD-Delphi程序暴力破解
  9. 云垒·私有云一体化安全管理平台
  10. JavaScript闭包初相识
  11. 2017 年最受欢迎的 10个编程挑战网站
  12. Mac SecureCRT 下载、安装详细步骤
  13. 日语五十音平假名 识读卡片 笔顺
  14. 使用PS将图片自然从清晰到模糊过渡
  15. 18年,中国互联网的产品墓场
  16. iMovie 裁剪视频
  17. No.476 数字的补数
  18. 云脉OCR文档管理软件档案加工管理必备
  19. 华为视频显示服务器异常,给予用户一份贴心|(数十份案例)APP异常界面与Toast产品设计落地...
  20. sicp3.5.2、3.5.3节部分习题尝试解答

热门文章

  1. UIDatePicker得到的时间中怎么去掉时分秒(字符串操作知识拓展)--iOS开发
  2. 关于登录,存储token,验证本地token,请求头携带token。
  3. top、margin-top的区别
  4. CSV文件的导入和导出
  5. jmeter的参数和请求后的参数不一致问题
  6. PointNet和PointNet++论文解读
  7. 【持续更新】机器学习特征工程实用技巧大全
  8. 金融风控指标:WOE, IV, KS,LIFT值和PSI
  9. 微信开发者工具调试大法
  10. 财务管理----记账凭证