某些场景下我们接受和发送的数据都是byte数组,例如在socket传输中,发送、者接收的数据都是 byte数组,或者是自定义传输协议或者文件格式中,为了保证数据安全、节省流量服务端需要对数据进行先加密、压缩,然后再进行传输;客户端对传输过来的数据进行解压缩、解密。而实际中我们会传输各种类型的数据,比如int,long,short间等等。
这就需要我们在使用中完成byte类型和short,int,long,float之间的转换。转换的核心在于其他类型的数据每位所占的转换后所占的byte不同。首先说一下用的最多的byte[]和int之间的转换
-
-
-
-
-
-
- public static byte[] int2byteArray(int num) {
- byte[] result = new byte[4];
- result[0] = (byte) (num >>> 24);
- result[1] = (byte) (num >>> 16);
- result[2] = (byte) (num >>> 8);
- result[3] = (byte) (num);
- return result;
- }
-
-
-
-
-
-
-
- public static int byteArray2int(byte[] b) {
- byte[] a = new byte[4];
- int i = a.length - 1, j = b.length - 1;
- for (; i >= 0; i--, j--) {
- if (j >= 0)
- a[i] = b[j];
- else
- a[i] = 0;
- }
- int v0 = (a[0] & 0xff) << 24;
- int v1 = (a[1] & 0xff) << 16;
- int v2 = (a[2] & 0xff) << 8;
- int v3 = (a[3] & 0xff);
- return v0 + v1 + v2 + v3;
- }
byte[]和short的互转
-
-
-
-
-
-
-
-
-
- public static void short2byteArray(byte b[], short s, int index) {
- b[index + 1] = (byte) (s >> 8);
- b[index + 0] = (byte) (s >> 0);
- }
-
-
-
-
-
-
-
-
-
- public static short byteArray2short(byte[] b, int index) {
- return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
- }
byte[]和char的互转
-
-
-
-
-
-
- public static void char2byteArray(byte[] bb, char ch, int index) {
- int temp = (int) ch;
-
- for (int i = 0; i < 2; i++) {
-
- bb[index + i] = new Integer(temp & 0xff).byteValue();
- temp = temp >> 8;
- }
- }
-
-
-
-
-
-
-
- public static char byteArray2char(byte[] b, int index) {
- int s = 0;
- if (b[index + 1] > 0)
- s += b[index + 1];
- else
- s += 256 + b[index + 0];
- s *= 256;
- if (b[index + 0] > 0)
- s += b[index + 1];
- else
- s += 256 + b[index + 0];
- char ch = (char) s;
- return ch;
- }
byte[]和float的互转
-
-
-
-
-
-
-
- public static void float2byteArray(byte[] bb, float x, int index) {
-
- int l = Float.floatToIntBits(x);
- for (int i = 0; i < 4; i++) {
- bb[index + i] = new Integer(l).byteValue();
- l = l >> 8;
- }
- }
-
-
-
-
-
-
-
-
- public static float byteArray2float(byte[] b, int index) {
- int l;
- l = b[index + 0];
- l &= 0xff;
- l |= ((long) b[index + 1] << 8);
- l &= 0xffff;
- l |= ((long) b[index + 2] << 16);
- l &= 0xffffff;
- l |= ((long) b[index + 3] << 24);
- return Float.intBitsToFloat(l);
- }
byte[]和double的互转
-
-
-
-
-
-
-
- public static void double2byteArray(byte[] bb, double x, int index) {
-
- long l = Double.doubleToLongBits(x);
- for (int i = 0; i < 4; i++) {
- bb[index + i] = new Long(l).byteValue();
- l = l >> 8;
- }
- }
-
-
-
-
-
-
-
-
- public static double byteArray2double(byte[] b, int index) {
- long l;
- l = b[0];
- l &= 0xff;
- l |= ((long) b[1] << 8);
- l &= 0xffff;
- l |= ((long) b[2] << 16);
- l &= 0xffffff;
- l |= ((long) b[3] << 24);
- l &= 0xffffffffl;
- l |= ((long) b[4] << 32);
- l &= 0xffffffffffl;
- l |= ((long) b[5] << 40);
- l &= 0xffffffffffffl;
- l |= ((long) b[6] << 48);
- l &= 0xffffffffffffffl;
- l |= ((long) b[7] << 56);
- return Double.longBitsToDouble(l);
- }
byte[]和long相互转换
-
-
-
-
-
- public static byte[] longTobyteArray(long num) {
- byte[] result = new byte[8];
- result[0] = (byte) (num >>> 56);
- result[1] = (byte) (num >>> 48);
- result[2] = (byte) (num >>> 40);
- result[3] = (byte) (num >>> 32);
- result[4] = (byte) (num >>> 24);
- result[5] = (byte) (num >>> 16);
- result[6] = (byte) (num >>> 8);
- result[7] = (byte) (num);
- return result;
- }
-
-
-
-
-
-
- public static long byteArrayTolong(byte[] byteArray) {
- byte[] a = new byte[8];
- int i = a.length - 1, j = byteArray.length - 1;
- for (; i >= 0; i--, j--) {
- if (j >= 0)
- a[i] = byteArray[j];
- else
- a[i] = 0;
- }
-
-
- long v0 = (long) (a[0] & 0xff) << 56;
- long v1 = (long) (a[1] & 0xff) << 48;
- long v2 = (long) (a[2] & 0xff) << 40;
- long v3 = (long) (a[3] & 0xff) << 32;
- long v4 = (long) (a[4] & 0xff) << 24;
- long v5 = (long) (a[5] & 0xff) << 16;
- long v6 = (long) (a[6] & 0xff) << 8;
- long v7 = (long) (a[7] & 0xff);
- return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7;
- }
稍微注意一下就能发现,各种类型与byte之间的转换主要是位数的差异,在转换过程中涉及到的算法也是移位,只要你理解了这个过程,那么数据传输过程涉及到byte和其他类型数据的转换就很简单了
最后是完成的代码
- package com.algorithm.example;
-
- public class BytesUtil {
-
-
-
-
- public static void main(String[] args) {
-
-
- }
-
-
-
-
-
-
-
- public static byte[] int2byteArray(int num) {
- byte[] result = new byte[4];
- result[0] = (byte) (num >>> 24);
- result[1] = (byte) (num >>> 16);
- result[2] = (byte) (num >>> 8);
- result[3] = (byte) (num);
- return result;
- }
-
-
-
-
-
-
-
- public static int byteArray2int(byte[] b) {
- byte[] a = new byte[4];
- int i = a.length - 1, j = b.length - 1;
- for (; i >= 0; i--, j--) {
- if (j >= 0)
- a[i] = b[j];
- else
- a[i] = 0;
- }
- int v0 = (a[0] & 0xff) << 24;
- int v1 = (a[1] & 0xff) << 16;
- int v2 = (a[2] & 0xff) << 8;
- int v3 = (a[3] & 0xff);
- return v0 + v1 + v2 + v3;
- }
-
-
-
-
-
-
-
-
-
-
- public static void short2byteArray(byte b[], short s, int index) {
- b[index + 1] = (byte) (s >> 8);
- b[index + 0] = (byte) (s >> 0);
- }
-
-
-
-
-
-
-
-
-
- public static short byteArray2short(byte[] b, int index) {
- return (short) (((b[index + 1] << 8) | b[index + 0] & 0xff));
- }
-
-
-
-
-
-
-
- public static void char2byteArray(byte[] bb, char ch, int index) {
- int temp = (int) ch;
-
- for (int i = 0; i < 2; i++) {
-
- bb[index + i] = new Integer(temp & 0xff).byteValue();
- temp = temp >> 8;
- }
- }
-
-
-
-
-
-
-
- public static char byteArray2char(byte[] b, int index) {
- int s = 0;
- if (b[index + 1] > 0)
- s += b[index + 1];
- else
- s += 256 + b[index + 0];
- s *= 256;
- if (b[index + 0] > 0)
- s += b[index + 1];
- else
- s += 256 + b[index + 0];
- char ch = (char) s;
- return ch;
- }
-
-
-
-
-
-
-
-
- public static void float2byteArray(byte[] bb, float x, int index) {
-
- int l = Float.floatToIntBits(x);
- for (int i = 0; i < 4; i++) {
- bb[index + i] = new Integer(l).byteValue();
- l = l >> 8;
- }
- }
-
-
-
-
-
-
-
-
- public static float byteArray2float(byte[] b, int index) {
- int l;
- l = b[index + 0];
- l &= 0xff;
- l |= ((long) b[index + 1] << 8);
- l &= 0xffff;
- l |= ((long) b[index + 2] << 16);
- l &= 0xffffff;
- l |= ((long) b[index + 3] << 24);
- return Float.intBitsToFloat(l);
- }
-
-
-
-
-
-
-
-
- public static void double2byteArray(byte[] bb, double x, int index) {
-
- long l = Double.doubleToLongBits(x);
- for (int i = 0; i < 4; i++) {
- bb[index + i] = new Long(l).byteValue();
- l = l >> 8;
- }
- }
-
-
-
-
-
-
-
-
- public static double byteArray2double(byte[] b, int index) {
- long l;
- l = b[0];
- l &= 0xff;
- l |= ((long) b[1] << 8);
- l &= 0xffff;
- l |= ((long) b[2] << 16);
- l &= 0xffffff;
- l |= ((long) b[3] << 24);
- l &= 0xffffffffl;
- l |= ((long) b[4] << 32);
- l &= 0xffffffffffl;
- l |= ((long) b[5] << 40);
- l &= 0xffffffffffffl;
- l |= ((long) b[6] << 48);
- l &= 0xffffffffffffffl;
- l |= ((long) b[7] << 56);
- return Double.longBitsToDouble(l);
- }
- }