首页 > 编程语言 >Java大小端转换 Java大端转小端 Java小端转大端

Java大小端转换 Java大端转小端 Java小端转大端

时间:2024-09-18 22:22:15浏览次数:11  
标签:小端 src Java 字节 tar 10 大端 byte

Java大小端转换 Java大端转小端 Java小端转大端

写在前面

一段内存地址的两边分为高位和低位,就像鸡蛋的两边,大的一端称为大端,小的一段称为小端。

在内存地址的高位存储内存的低地址端,称为大端。比如整数占4个字节内存{0, 1, 2, 3},1为内存低地址端,3为内存高地址端,整数1大端存储就是 { 0, 0, 0, 1 },Java 常用此种方式。
相反的,在内存地址的高位存储内存的高地址端,称为小端。整数1小端存储就是 { 1, 0, 0, 0 }。

大端存储的优势:第一个字节是高位,很容易判断数的正负。
小端存储的优势:第一个字节是低位,最后一个字节是高位,运算时从低到高(简单理解从左到右)依次取出地址字节数,最终把符号位刷新,运算更高效。

Java字节转大端整数

public static int bytesToIntBigEndian(byte[] bytes) {
    // byte数组中序号大的在右边
    return bytes[3] & 0xFF |
            (bytes[2] & 0xFF) << 8 |
            (bytes[1] & 0xFF) << 16 |
            (bytes[0] & 0xFF) << 24;
}

也可以使用 Java ByteBuffer 实现:

// {0, 0, 0, 10}  --> 10
int tar = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).getInt();

Java整数转大端字节

public static byte[] intToBigEndianBytes(int value) {
    byte[] src = new byte[4];
    src[0] = (byte) ((value >> 24) & 0xFF);
    src[1] = (byte) ((value >> 16) & 0xFF);
    src[2] = (byte) ((value >> 8) & 0xFF);
    src[3] = (byte) (value & 0xFF);
    return src;
}

也可以使用 Java ByteBuffer 实现:

// {0, 0, 0, 10}
byte[] bytes1 = ByteBuffer.allocate(4).putInt(10).array();

Java数组转小端整数

// {0, 0, 0, 10} --> 167772160
int tar = ByteBuffer.wrap(bytes1).order(ByteOrder.BIG_ENDIAN).getInt();

Java大小端转换

大小端转换本质就是数组反转,一个循环即可。

// {0, 0, 0, 10} --> {10, 0, 0, 0}
public static byte[] reverseByteEndian(byte[] src){
   byte[] tar = new byte[src.length];
   for(int i=0; i< tar.length; i++){
       tar[i] = src[tar.length - i - 1];
   }
   return tar;
}

提醒

跨语言联调接口时,尤其是和 C 语言这种底层语言调接口时,如果发现数据总是异常,可以先用整数转换为字节数组比对一次,确认大小端是否和本语言一致。如果不一致,就需要一端进行转换,确保接口两边一致。

标签:小端,src,Java,字节,tar,10,大端,byte
From: https://blog.csdn.net/yueeryuanyi/article/details/142344223

相关文章

  • java-基于springboot实现家教管理系统
    摘要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装家教管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,家教管理系统的有效运......
  • JavaScript语法入门七 数据类型
     BigInt类型在JavaScript中,“number”类型无法代表大于 253(或小于 -253)的整数。此时可以使用BigInt类型。使用方法:在数字的尾部附加一个n。constbigInttest=12345678901234567890123456789012345678901121345526789n; String类型js中只有String类型没有char类型。定义时......
  • 【面试经验】2024年9月滴滴后端笔试 java
    比较简单,两题编程。选择题好像是20题,有部分不确定,有C++的几题。题目记不清了,凭印象写一下。编程题第一题充电第一题:n个玩具,m电量,尽可能让一个大的区间内的玩具的电量充满。输出充满电的玩具个数。双指针+滑动窗口。importjava.util.Scanner;publicclassMa......
  • 1. 如何在Java中连接MySQL数据库?请解释使用JDBC连接的步骤。
    要在Java中连接MySQL数据库,通常使用JDBC(JavaDatabaseConnectivity)API。这是一个用于执行SQL语句的JavaAPI,可以用来访问关系型数据库。下面是使用JDBC连接MySQL数据库的详细步骤:1.添加MySQLJDBC驱动首先,需要确保项目中包含MySQL的JDBC驱动程序。这个驱动程序通常是一个......
  • java list<Map<String,Object>> 转成对应的对象
    将List<Map<String,Object>>转换为对应的对象可以通过反射或手动映射来实现。以下是一个示例,演示如何使用手动映射的方式将List<Map<String,Object>>转换为对象列表。示例代码假设我们有一个简单的对象类User:publicclassUser{privateStringname;privateint......
  • 前端——JavaScript练习 做一个todoList
    用前端制作一个todoList的表格,实现更新、删除、修改等功能。涉及几个知识点:设置最小高度(宽度):.container{min-width:350px;/*最小宽度最小不会小于210px*/} 去掉外轮廓outline:none;去除字符串两端的空白字符(包括空格、制表符、......
  • java代码-编译-打包-执行_云原生时代笔记总结
    楔子:可能201几年开发的时候,有个ide,加上打包插件,就可以开发了,测试的时候war包扔到服务器容器里就可以跑起来了。(而且没有做过批处理的小伙伴对jar包执行可能不甚熟悉,只见过web容器的目录结构和lib中的jar包。)但是2015年之后应该是全面进入,云原生时代。大量操作需要linux命令行......
  • java-----Stream流
    什么是Stream?Stream将要处理的元素集合看作一种流,在流的过程中,借助StreamAPI对流中的元素进行操作,比如:筛选、排序、聚合等Stream流的作用:结合了Lambda表达式,简化集合、数组的操作Stream流的使用步骤:    ①先得到一条Stream流(流水线),并把数据放上去  ......
  • [Java基础]Stream流
    当我第一次阅读Java8中的StreamAPI时,说实话,我非常困惑,因为它的名字听起来与JavaI0框架中的InputStream和OutputStream非常类似。但是实际上,它们完全是不同的东西。Java8Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作。本文......
  • JDK21中找不到 javax.annotation.Resource 了?
    在JDK9及以后版本,特别是到JDK21,javax.annotation.Resource这样的类已经不再包含在标准的JDK中。原因是从JDK9开始,Java进行了模块化(ProjectJigsaw),并移除了部分与JavaEE(现在称为JakartaEE)相关的包,例如javax.annotation。为什么会找不到javax.annotation.Resourc......