Java大小端转换 Java大端转小端 Java小端转大端
写在前面
一段内存地址的两边分为高位和低位,就像鸡蛋的两边,大的一端称为大端,小的一段称为小端。
在内存地址的高位存储内存的低地址端,称为大端。比如整数占4个字节内存{0, 1, 2, 3},1为内存低地址端,3为内存高地址端,整数1大端存储就是 { 0, 0, 0, 1 },Java 常用此种方式。
相反的,在内存地址的高位存储内存的高地址端,称为小端。整数1小端存储就是 { 1, 0, 0, 0 }。
大端存储的优势:第一个字节是高位,很容易判断数的正负。
小端存储的优势:第一个字节是低位,最后一个字节是高位,运算时从低到高(简单理解从左到右)依次取出地址字节数,最终把符号位刷新,运算更高效。
Java字节转大端整数
public static int bytesToIntBigEndian(byte[] bytes) {
// byte数组中序号大的在右边
return bytes[3] & 0xFF |
(bytes[2] & 0xFF) << 8 |
(bytes[1] & 0xFF) << 16 |
(bytes[0] & 0xFF) << 24;
}
也可以使用 Java ByteBuffer 实现:
// {0, 0, 0, 10} --> 10
int tar = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt();
Java整数转大端字节
public static byte[] intToBigEndianBytes(int value) {
byte[] src = new byte[4];
src[0] = (byte) ((value >> 24) & 0xFF);
src[1] = (byte) ((value >> 16) & 0xFF);
src[2] = (byte) ((value >> 8) & 0xFF);
src[3] = (byte) (value & 0xFF);
return src;
}
也可以使用 Java ByteBuffer 实现:
// {0, 0, 0, 10}
byte[] bytes1 = ByteBuffer.allocate(4).putInt(10).array();
Java数组转小端整数
// {0, 0, 0, 10} --> 167772160
int tar = ByteBuffer.wrap(bytes1).order(ByteOrder.BIG_ENDIAN).getInt();
Java大小端转换
大小端转换本质就是数组反转,一个循环即可。
// {0, 0, 0, 10} --> {10, 0, 0, 0}
public static byte[] reverseByteEndian(byte[] src){
byte[] tar = new byte[src.length];
for(int i=0; i< tar.length; i++){
tar[i] = src[tar.length - i - 1];
}
return tar;
}
提醒
跨语言联调接口时,尤其是和 C 语言这种底层语言调接口时,如果发现数据总是异常,可以先用整数转换为字节数组比对一次,确认大小端是否和本语言一致。如果不一致,就需要一端进行转换,确保接口两边一致。
标签:小端,src,Java,字节,tar,10,大端,byte From: https://blog.csdn.net/yueeryuanyi/article/details/142344223