楼主最近很悲惨,下载了 Android 的源码,而后 mac 的硬盘空间就没了,并且编译 Android 源码须要将建立一个大小写不敏感的分区,因此须要将源码存在别的地方,最初是使用的硬盘,可是失败了(硬盘用的 exfat 格式), 后来用云盘,笔记,QQ 都不行,要么文件过多不给传,要么要收费,总之就是不行,正当踌躇之际,想起了一句老话,'本身动手,丰衣足食', 因此萌生了本身写个工具的念头,固然,给本身用的,不须要写的那么好,可是写的过程当中出现了一些小问题,因此写这篇博客记录一下。java
在设计报文的时候,须要将 int 与 byte, long 与 byte 互转,转化的算法天然是没啥问题,可是恰恰 byte 转 int ,或者 byte 转 long 有时出现的结果不正确,最后发现是 java 类型的隐士转化的问题,主要是 java 没有无符号类型,因此若是 byte 最高位是 1,那么移位的时候会将 byte 转化为 int, 这时候 int 的符号为会变成 1, 致使结果不对。git
解决方案就是将转化为的 int 或者 long 只保留低 8 为, 也就是与 0xFF 作 & 运算,由于只有低 8 位是可用的。主要是去掉高位的符号位github
1 public class ByteUtils { 2 3 public static int toInteger(byte[] buff, int start){ 4 int ret = 0; 5 if (buff != null && buff.length >= 4 && start + 4 <= buff.length){ 6 ret = ((buff[start] & 0xFF) << 24) | ((buff[start + 1] & 0xFF) << 16) | ((buff[start + 2] & 0xFF) << 8) | (buff[start + 3] & 0xFF); 7 } 8 return ret; 9 } 10 11 public static byte[] tobyte(int i){ 12 byte[] ret = new byte[4]; 13 14 ret[0] = (byte) (i >> 24 & 0x000000FF); 15 ret[1] = (byte) (i >> 16 & 0x000000FF); 16 ret[2] = (byte) (i >> 8 & 0x000000FF); 17 ret[3] = (byte) (i & 0x000000FF); 18 19 return ret; 20 } 21 22 public static long toLong(byte[] buff, int start) { 23 long ret = 0; 24 if (buff != null && start + 8 <= buff.length){ 25 ret = ((buff[start] & 0xFFl) << 56) | ((buff[start + 1] & 0xFFl) << 48) | ((buff[start + 2] & 0xFFl) << 40) | ((buff[start + 3] & 0xFFl) << 32) 26 | ((buff[start + 4] & 0xFFl) << 24) | ((buff[start + 5] & 0xFFl) << 16) | ((buff[start + 6] & 0xFFl) << 8) | (buff[start + 7] & 0xFFl); 27 } 28 return ret; 29 } 30 31 public static byte[] tobyte(long i){ 32 byte[] ret = new byte[8]; 33 34 ret[0] = (byte) (i >> 56 & 0x000000FF); 35 ret[1] = (byte) (i >> 48 & 0x000000FF); 36 ret[2] = (byte) (i >> 40 & 0x000000FF); 37 ret[3] = (byte) (i >> 32 & 0x000000FF); 38 ret[4] = (byte) (i >> 24 & 0x000000FF); 39 ret[5] = (byte) (i >> 16 & 0x000000FF); 40 ret[6] = (byte) (i >> 8 & 0x000000FF); 41 ret[7] = (byte) (i & 0x000000FF); 42 43 return ret; 44 } 45 }
项目比较简陋,可是够本身用了 github 地址算法