请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

Java 大小端转换(基于ByteBuffer)

[复制链接]
查看: 107|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
80196
发表于 2019-12-5 12:59 | 显示全部楼层 |阅读模式
Java 大小端转换(基于ByteBuffer)  游戏 298108-20191204094550018-1438992673

        图00 Big-Endian(左)and little-endian(右)
巨细真个底子常识:
小端 ( little-endian):低位字节在前,高位字节在后。大端(Big-Endian),则反之。具体而言,就是为了说清楚,CPU架构中1字(word)的存储顺序。盘算机内存中数据自然活动的顺序就是:低位先来,高位紧随后来
JAVA中全数的二进制文件都是按大端存储,这类存储方式也被称为network order。即在全数的平台上,如Mac、 PC、 UNIX等等运转JAVA,都不用考虑巨细真个题目。麻烦的是不同说话斥地的步伐举行数据交换,如笔者近来的项目,二进制文件是由C天生的,经过redis 消息通道以Json格式发过来,而C说话默许是小端形式,就触及到巨细端转换。有些平台(如Mac、IBM 390)内置用的大端形式,此外一些平台内置用的小端形式 (如Intel)。JAVA帮你屏障了各平台字节顺序的不同。高兴呀
Java 大小端转换(基于ByteBuffer)  游戏 298108-20191204100353250-38005695

32位16进制的 0x45679812在内存中的存储(巨细端形式)以下图:
Java 大小端转换(基于ByteBuffer)  游戏 298108-20191204095438544-1954338172


JAVA代码实现:基于ByteBuffer(可经过Order来设备大端大要小端,默以为大端 — Big-Endian),代码实现以下图(支持收集端口—2字节及4字节的int转换;同时包含了收集端口0 ~ 65535的分析):
  1.     /**     * 将小端bytes数据转化为大端数据     *      * 默许收集传输字节为大端,java 全数为大端(与平台无关)     * 关于 “Little-Endian and Big-Endian”,详情请参考:     *     * @param bytes     * @return 转化后获得的整数     * @Link https://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/     *
  2.      */    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年内把代码写好,技术博客字字斟酌,对峙零拷贝和原创
  • 写博客的意义在于打磨文笔,练习逻辑条理性,加深对常识的系统性大白;假如恰恰又对他人有点帮助,那真是一件使人高兴的事
*****************************************************************************************************

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表