大小端的基础知识:

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

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

例如,32位16进制的 0x45679812在内存中如下存储:

基于ByteBuffer(可通过Order来设置大端或者小端,默认为大端 —— Big-Endian),代码实现如下图(支持网络端口—2字节及4字节的int技术):

    /**
     * 将小端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年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
  • 写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

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

Java 大小端转换(基于ByteBuffer)的更多相关文章

  1. C# 网络通信大小端转换类

    本篇文章主要介绍了"C# 网络通信大小端转换类" using System;namespace Framework.NetPackage.Common { /// <summ ...

  2. c/c++ int,float,short 大小端转换函数

    unsigned int(uint32_t)大小端转换函数 unsigned int BLEndianUint32(unsigned int value) { return ((value & ...

  3. 【转】[c/c++ ]字节序与大小端转换--不错

    原文网址:http://blog.csdn.net/kuai0705/article/details/20841133 注明: 以下内容均为学习内容整理,记录,便于自己学习,并非完全意义上的自产,如有 ...

  4. boost 大小端转换

    boost 中有一个edmian 里面有转换函数模板 native_to_little<T> 本地转换为小端 native_to_bit<T> 本地转换为大端

  5. CPU大小端模式及转换

    通信协议中的数据传输.数组的存储方式.数据的强制转换等这些都会牵涉到大小端问题. CPU的大端和小端模式很多地方都会用到,但还是有许多朋友不知道,今天暂且普及一下. 一.为什么会有大小端模式之分呢? ...

  6. c++字符和字符串转整数类型及大小端

    在网络传输中,很多数据都是按字节传递而不是字符串.最近就遇到了这个问题,在刚开始学c语言时都没有问题,可能太久不用了,记录一下 在报中文,用2个字节hex码来表示报文正文长度,什么是hex码呢 就是1 ...

  7. java的大小端和转换

    一直以为大小端针对的bit的顺序,今天才知道:大小端的分度值是 byte,即每一个byte都是按照正常顺序,但是byte组装成一个int 或者是 long等时每个byte的摆放位置不同. 测试代码: ...

  8. C++/java之间的Socket通信大小端注意事项

    在一个物联往项目中,需要java云平台与一个客户端做socket定制协议的通信:然而在第一次测试时,并没有按照预想的那样完成解析.查找资料以后是因为客户端的数据读取方式为小端模式,而java默认采用大 ...

  9. 扩展ASCII码,不同的国家有不同的字符集。Unicode转换为utf8的规则,utf8没有大小端的问题。超过0xFFFF的Unicode字符WINAPI也无能为力(附各种字符编码表及转换表)good

    一.概念 1,ASCII             ASCII(American Standard Code for Information Interchange),中文名称为美国信息交换标准代码.是 ...

随机推荐

  1. 【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!

    目录 1.异常 1.1 异常概念 1.2 异常体系 1.3 异常分类 1.4 异常的产生过程解析 2. 异常的处理 2.1 抛出异常throw 2.2 Objects非空判断 2.3 声明异常thro ...

  2. 这一次,终于系统的学习了 JVM 内存结构

    最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...

  3. Python进阶函数

    一.函数的动态参数 之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数. 动态 ...

  4. group:状压dp,轮廓线

    神仙题.但是难得的傻孩子cbx没有喊题解,所以也就难得的自己想出来了一个如此神仙的题. 如果是自己想的,说它神仙是不是有点不合适啊..? 反正的确不好像.关键就在于这个标签.颓完标签就差不多会了. % ...

  5. 7.25 NOIP模拟8

    这次考试前面状态还行,后两个小时真是一言难尽,打了个T3的n^2暴力就懵逼了,不知道怎么优化. T1.匹配 看了一边题发现不太懂(这不是考试的难度啊),然后水完T2后回来5分钟水过,非常愉快的一道题. ...

  6. js实现列表从下往上循环滚动

    html: <div class="liscorll"> <ul> <li>内容</li> </ul> </div ...

  7. 在vue中如何使用axios

    1.前言 在Vue1.0的时候有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource. 关于为什么放弃推荐? -& ...

  8. 机器学习环境搭建安装TensorFlow1.13.1+Anaconda3.5.3+Python3.7.1+Win10

    安装Python3.7.1 此处不再赘述安装过程,作为记录 安装Anaconda3.5.3 Anaconda3-5.3.0-Windows-x86_64.exe 方案1. 可以直接从官网https:/ ...

  9. python经典算法题:求字符串中最长的回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...

  10. 访问控制列表ACL

    1.ACL Access list ,访问控制列表. 2.作用 限制网络中的地址访问. 3.主要内容 Eg: Router(config)#access-list ? <一>. <1 ...