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 语言这种底层语言调接口时,如果发现数据总是异常,可以先用整数转换为字节数组比对一次,确认大小端是否和本语言一致。如果不一致,就需要一端进行转换,确保接口两边一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值