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
原创粉丝点击