Java int[] 跟 byte[] 的相互转化,可还原
来源:互联网 发布:php int加括号 编辑:程序博客网 时间:2024/05/21 16:27
1.byte转int
java中byte八个字节,int三十二个字节, 因此只需要在前面补24个0即可。使用int强转即可搞定。
byte b = -3; int i = b;得到int。
因为int类型刚好占用byte类型的四倍空间, 因此可以将byte数组转化为Int数组, 使用特定的方式标记。
例如: 如果byte数组长度刚好是4的倍数, 可以直接转化为int数组, 否则可以在后面添置占位,得到int数组。
见:
private static int[] byte2int(byte[] b) { // 数组长度对4余数 int r; byte[] copy; if ((r = b.length % 4) != 0) { copy = new byte[b.length - r + 4]; System.arraycopy(b, 0, copy, 0, b.length); } else { copy = b; } int[] x = new int[copy.length /4 + 1]; int pos = 0; for (int i = 0; i < x.length - 1; i ++) { x[i] = (copy[pos] << 24 & 0xff000000) | (copy[pos+1] << 16 & 0xff0000) | (copy[pos+2] << 8 & 0xff00) | (copy[pos+3] & 0xff); pos += 4; } x[x.length - 1] = r; return x; }
2.int转byte
int比byte占用空间更大,强转会直接抹掉高位(补码)。int x = -130; System.out.println((byte) x); // 126 x = 129; System.out.println((byte) x); // -127
标题一中的byte数组转化的数组是可以转回来的。
见:
private static byte[] int2byte(int[] x) { int pos = x[x.length - 1]; byte[] b = new byte[(x.length - 1) * 4]; int j = 0; for (int i = 0; i < b.length; i += 4) { b[i] = (byte) ((x[j] & 0xff000000) >> 24); b[i+1] = (byte) ((x[j] & 0xff0000) >> 16); b[i+2] = (byte) ((x[j] & 0xff00) >> 8); b[i+3] = (byte) ((x[j] & 0xff)); j ++; } int noNeed = pos == 0 ? 0 : pos - 4; byte[] r = new byte[b.length + noNeed]; System.arraycopy(b, 0, r, 0, r.length); return r; }
3.展示点
如上代码展示便是:
public static void main(String[] args) { String s = "China中国"; System.out.println(Arrays.toString(s.getBytes())); System.out.println(new String(int2byte(byte2int(s.getBytes())))); }
展示代码没有任何意义。但是这里面显示了很多Java存储规则的东西。
public static void main(String[] args) { byte b = -2; byte bin = (byte) 0x82; System.out.println(Integer.toBinaryString(b)); // 11111111111111111111111111111110 补码 System.out.println(Integer.toBinaryString(bin)); // 11111111111111111111111110000010 补码 System.out.println(~b); // 1 补码取反 System.out.println(~bin); // 125 补码取反 System.out.println(b & 0x7f); // 126 补码与补码相与(强转之后运算) System.out.println(bin & 0x7f); // 2 补码与补码相与(强转之后运算) System.out.println(b & 0xff); // 254 补码与补码相与(强转之后运算) System.out.println(bin & 0xff); // 130 补码与补码相与(强转之后运算) }上诉案例中汉字经历编码会有可能得到负数的byte字节。体现到Integer里面也是补码的数据。但是因为转码的时候未做任何变更,还原的时候也是依次还原,因此值是可以被还原回来的。
System.out.println(Integer.toBinaryString(byte2int("中".getBytes())[0])); // 11100100 10111000 10101101 00000000 // -100 -56 -45 补码值(伪) // -28 -72 -83 原码值 System.out.println(Arrays.toString(int2byte(byte2int("中".getBytes()))));
0 0
- Java int[] 跟 byte[] 的相互转化,可还原
- java中byte与int相互转化的原理
- C++: byte和int的相互转化
- C++: byte和int的相互转化
- C++: byte 和 int 的相互转化
- C++: byte和int的相互转化
- C++: byte和int的相互转化
- JAVA的数组 && 原始类型和引用类型以及String与int long相互转化 && String与byte[]相互转化
- C++: byte数组和int整数的相互转化
- byte数组与int数组相互转化
- Android Int和byte数组,double和byte数组的相互转化
- java int 与 byte[] 转化
- 在java中int类型跟byte数组的转换
- Java中byte[]、char[]和String的相互转化
- java int与byte[]数组的相互转换 补码
- java中的int类型和byte数组的相互转换
- java中int与byte的相互转换
- java中int与byte的相互转换
- 广义回归神经网络GRNN ,竞争神经网络,自组织映射神经网络
- 我与Django
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
- 基于AFNetworking3.0网络封装
- Java创建excel表格并下载
- Java int[] 跟 byte[] 的相互转化,可还原
- UTF-8 的tomcat接受GBK请求乱码
- Masonry的使用
- Redhat hadoop2.7.2 eclipse配置
- Thrift入门及Java实例演示
- HDU 2147 博弈
- 没有建联合索引导致cpu过高
- SDWebImage实现原理
- 搭建git私有服务器及同步更新自己网站的文件