原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6754213

错误代码一

byte[] bs = {1,2,3,4,};//以下代码是不好的代码long num1 = bs[0] < 0 ? (bs[0] + 256) * 256 + bs[1] : bs[0] * 256 + bs[1];long num2 = bs[2] < 0 ? (bs[2] + 256) * 256 + bs[3] : bs[2] * 256 + bs[3];long num = num1 * 65536 + num2;        System.out.println(num);

结果应该是不会出问题的。其实bs-byte数组,是一个硬件设备通过socket传入的一组数值。这段代码,我其实看到的第一眼,就应该能理解,其实传入的byte数组,是一个32位的整数。

不难看出,代码的原作者,对java的位运算基本是不理解的。其实原作者应该是很聪明的,这段代码肯定是经过了反复的推敲才得出来的。

其实,这段代码,这么写应该更好:

long numbyte = (bs[0] << 24) | (bs[1] << 16) | (bs[2] <<8) | bs[3];

但是这么写,还是有问题的。从设备过来的4个字节的整数,应该是个无符号整数。而我们做bs[0]<<24的时候,实际上bs[0]是带符号的。我们把bs数组重新改一下数据:

byte[] bs = {

-1,2,3,4,

};

运行出来的结果,就是一个负数,显然不是我们想要的。

也就是说,我们要把byte的第一位,当作数据来操作,而不是当作符号来处理。

修改后的代码:

//左边第一位不是符号位long firstbyte = bs[0];if ((bs[0] & 0x80) != 0) {firstbyte = (bs[0] & 0x7f) | 0x80;}long numbyte = (firstbyte << 24) | (bs[1] << 16) | (bs[2] << 8) | bs[3];System.out.println(numbyte);


更多相关文章

  1. Android使用SharedPreferences保存数组
  2. android OpenGLES开发 第五课 纹理映射
  3. Fragment封装切换
  4. 编写高效Android代码
  5. android email 邮件转发 附件不能转发问题的解决
  6. android中onClick事件的实现
  7. [Android实例] android登录Web以及登录保持,cookie管理相关
  8. Android(安卓)Audio代码分析=Audio Strategy
  9. android中setOnClickListener的那点事

随机推荐

  1. MongoDB 4.X CRUD 基本操作说明
  2. 一文了解 Kubernetes
  3. 活码二维码(动态二维码)域名池介绍
  4. 意派Epub360丨花式送祝福!这款新年H5模板
  5. MyCms 自媒体内容管理系统安装环境要求
  6. html基础知识01
  7. 1.Ement常用语法、元素属性和布局标签
  8. 认识元素、Ement语法
  9. 12.21作业
  10. Emmet 常用语法、HTML5元素基础知识