Java 大小端转换(基于ByteBuffer)

简介: Java 大小端转换(基于ByteBuffer)

大小端的基础知识:

小端 ( little-endian):低位字节在前,高位字节在后。大端(Big-Endian),则反之。具体而言,就是为了说清楚,CPU架构中1字(word)的存储顺序。计算机内存中数据自然流动的顺序就是:低位先来,高位紧随其后

JAVA中所有的二进制文件都是按大端存储,这种存储方式也被称为network order。即在所有的平台上,如Mac、 PC、 UNIX等等运行JAVA,都不用考虑大小端的问题。麻烦的是不同语言开发的程序进行数据交换,如笔者最近的项目,二进制文件是由Python生成的,而Python语言默认是小端模式,就涉及到大小端转换。有些平台(如Mac、IBM 390)内置用的大端模式,其它一些平台内置用的小端模式 (如Intel)。

32位16进制的 0x45679812在内存中的存储(大小端模式)

JAVA代码实现:基于ByteBuffer(可通过Order来设置大端或者小端,默认为大端 — Big-Endian),代码实现如下图(支持网络端口—2字节及4字节的int转换;同时包括了网络端口0 ~ 65535的解析):

 /**
     * 将小端bytes数据转化为大端数据
     * <p>
     * 默认网络传输字节为大端,java 全部为大端(与平台无关)
     * 关于 “Little-Endian and Big-Endian”,详情请参考:
     *
     * @param bytes
     * @return 转化后得到的整数
     * @Link https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/
     * </p>
     */
    private int bytesToBigEndian(byte[] bytes) {
        int result = 0;
        if (bytes == null || bytes.length < 0)
            return -1;
        ByteBuffer buffer = ByteBuffer.wrap(bytes);
        buffer.order(ByteOrder.BIG_ENDIAN);
        if (bytes.length == RECORD_BYTES_SIZE) {
            result = buffer.getInt();
        } else if (bytes.length == PORT_BYTES_SIZE) {
            // 端口号:0 ~ 65535; Short: -32768 ~ 32767
            short tmp = buffer.getShort();
            result = tmp < 0 ? getUnsignedShort(tmp) : tmp;
        }
        if (result < 0) {
            logger.info("Length = " + result + " ; original data:" + bytes);
        }
        return result;
    }


相关文章
|
3月前
|
存储 Java
如何在 Java 中写入和读取 ByteBuffer
【8月更文挑战第22天】
119 0
|
3月前
|
存储 Java
如何在 Java 中创建 ByteBuffer
【8月更文挑战第22天】
63 0
|
Java Maven
java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J [duplicate]
java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_Mat(IIILjava/nio/ByteBuffer;)J [duplicate]
|
存储 缓存 Java
|
Java 容器
JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!(下)
JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!
156 0
JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!(下)
|
存储 Java API
JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!(上)
JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!
143 0
JDK又在写Bug!告诉你为何Java NIO的ByteBuffer这么垃圾!(上)
|
Java
阿里P8大佬通宵整理!解锁Java NIO的ByteBuffer全部使用姿势!(下)
NIO中的Buffer用于和NIO Channel交互。 数据是从Channel读入Buffer,从Buffer写入Channel。
205 0
阿里P8大佬通宵整理!解锁Java NIO的ByteBuffer全部使用姿势!(下)
|
存储 Java API
阿里P8大佬通宵整理!解锁Java NIO的ByteBuffer全部使用姿势!(上)
NIO中的Buffer用于和NIO Channel交互。 数据是从Channel读入Buffer,从Buffer写入Channel。
585 0
阿里P8大佬通宵整理!解锁Java NIO的ByteBuffer全部使用姿势!(上)
|
网络协议 Java
【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )
【Java 网络编程】TCP 数据传输示例 ( 客户端参数设置 | 服务器端参数设置 | ByteBuffer 存放读取数据类型 )
187 0