大小端的基础知识:

小端( 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. Swagger解决你手写API接口文档的痛

    首先,老规矩,我们在接触新事物的时候, 要对之前学习和了解过的东西做一个总结. 01 痛     苦 不做.不行 之前,前后端分离的系统由前端和后端不同的编写,我们苦逼的后端工程师会把自己已经写完的A ...

  2. centos转ubuntu常见问题总结:

    1.vmtools的安装 https://blog.csdn.net/weixin_41762173/article/details/79480832 2.镜像源替换 https://opsx.ali ...

  3. Flask:数据库的建模

    学习完模板系统,接下来要研究的就是框架对数据库的操作,不论python的那个框架,直接使用数据库API(redis.pymysql等)都可以进行操作,但是这些操作不够方便,于是就有了ORM 1.Fla ...

  4. H5 + WebGL 实现的地铁站 3D 可视化系统

    前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...

  5. [考试反思]0901NOIP模拟测试34:游离

    又是放假回来的收心考.幸而熬了夜回来也不至于很困(虽说第二天早上困成狗...) 说分数吧: skyhAK300,后面有220,220,220,190,190,180 我170,排第8.凑合,其实不太满 ...

  6. 基于canvas的流程编辑器

    今年由于项目上需要给客户的流程管理系统进行升级,其中包含流程的可视化.于是在网上找一些可以用的轮子,考察了D3,js.GooFlow.js.G6-Editor等工具后,发现D3,js学习成本太高,G6 ...

  7. 【gradle使用—gradle介绍】

    Gradle基本组件  Gradle是一个框架,定义了一套自己的规则,所以要搞清楚Gradle,必须要遵守它设计的原则,下面我们要先搞清楚一些Gradle的概念: Gradle中,每一个待编译的工程是 ...

  8. P3106 [USACO14OPEN]GPS的决斗(最短路)

    化简:够简的了.....但是!翻译绝对有锅. 这个最短路是从n到每个点的单源最短路,也就是最短路径树. 那么,思路就很明确了.建两个图,然后跑两边SPFA,记录下最短路径. 然后,对于两点之间的边,如 ...

  9. day 2 上午 挂饰 背包

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...

  10. 【建站03】WordPress网站如何去除RSS功能

    哈喽,大家好,我是帝哥,最近有小伙伴问我,如何去掉WordPress上的RSS功能,这个功能呢,说实话,我们很少会用到. 但是如果有点强迫症的话看着会很不舒服,所以,今天和大家分享一下如何去掉Word ...