当前位置: 移动技术网 > IT编程>开发语言>Java > Java 大小端转换(基于ByteBuffer)

Java 大小端转换(基于ByteBuffer)

2019年12月04日  | 移动技术网IT编程  | 我要评论

江苏卫视2018跨年演唱会,混个神仙当当,英式风格

大小端的基础知识:

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

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

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

 

附:

1)大小端说明 

 

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

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

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网