zoukankan      html  css  js  c++  java
  • Java 大小端转换(基于ByteBuffer)

            图00 Big-Endian(左)and little-endian(右)

    大小端的基础知识:

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

    转载请注明出处:https://www.cnblogs.com/NaughtyCat/p/little-endian-and-big-endian-based-on-bytebuffer-in-java.html

    JAVA中所有的二进制文件都是按大端存储,这种存储方式也被称为network order。即在所有的平台上,如Mac、 PC、 UNIX等等运行JAVA,都不用考虑大小端的问题。麻烦的是不同语言开发的程序进行数据交换,如笔者最近的项目,二进制文件是由C生成的,通过redis 消息通道以Json格式发过来,而C语言默认是小端模式,就涉及到大小端转换。有些平台(如Mac、IBM 390)内置用的大端模式,其它一些平台内置用的小端模式 (如Intel)。JAVA帮你屏蔽了各平台字节顺序的差异。开心呀

    32位16进制的 0x45679812在内存中的存储(大小端模式)如下图(作者【CoderBaby】:

    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;
        }

    附:

    1)大小端说明 https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/

    *****************************************************************************************************

    精力有限,想法太多,专注做好一件事就行

    • 我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
    • 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

    *****************************************************************************************************

  • 相关阅读:
    Windows下获取逻辑cpu数量和cpu核数量
    QtScript, QML, Quick1, Quick2, Declarative 之间的关系
    将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
    QPixmap的缓冲区
    Qt+QZXing编写识别二维码的程序
    ASP.NET 5:依赖注入
    angularJS之使用指令封装DOM操作
    Windows 10技术布局,谈微软王者归来
    Microsoft dotnetConf 2015
    Net社区虚拟大会
  • 原文地址:https://www.cnblogs.com/NaughtyCat/p/little-endian-and-big-endian-based-on-bytebuffer-in-java.html
Copyright © 2011-2022 走看看