Java int类型如何获取高低位

目录
  • int类型如何获取高低位
    • 大小端序
    • 获取int的高低位字节数组
  • 高低位和byte转int
    • 什么是高低位?
    • 什么是低8位?
    • 如何将byte转换为int?

int类型如何获取高低位

去年笔者和一个硬件厂商调试打印机的时候遇到这个一个问题,厂商需要打印报文中传输报文的长度标志,按大端序,将长度的高位和低位放到两个字节里,笔者由于基础知识不牢固,在这个问题上浪费了较长时间,今年开始写博客了,就记录一下这个问题。笔者使用了int来记录长度,其实应该用两个字节的short来记录,这样更简单。

大小端序

要想拿int的高低位字节,首先要理解大小端序。这里以int举例,int有四个字节A,B,C,D。那么内存里存储int类型占用了四个字节的位置,这四个字节在内存中肯定占用了连续递增的四个地址,大小端序指得就是这四个字节在这四个地址中是顺序排列的还是逆序排列的。如果是顺序排列的,那么我们叫大端序,如果是逆序排列的,就叫小端序。

再拿网络传输这个int值来举例,甲向乙传输数据,乙拿到甲传的字节数组以后要知道怎么拼接这四个字节,如果甲是按顺序传输这四个字节,而乙按逆序拼接四个字节,那么双方得到的int值肯定是不一样的。那么怎么解决这个问题呢?方法就是双方协定一个顺序,比如按大端序传输,甲将四个字节按大端序传输给乙,乙再按大端序拼接字节,这样双方得到的int值就是一样的了。

总结一下就是,大端序,高位字节在前,低位字节在后。小端序,高位字节在后,低位字节在前。一般交互都是默认大端序。

获取int的高低位字节数组

这里给出了大小端序的int和字节数组互转函数

    /**
     * 小端序 字节数组转int
     *
     * @param bytes
     * @return
     */
    public static int littleEndian(byte[] bytes) {
        return (bytes[0]&0XFF)
                | ((bytes[1]&0XFF) << 8)
                | ((bytes[2]&0XFF) << 16)
                | ((bytes[3]&0XFF) << 24);
    }

    /**
     * 大端序 字节数组转int
     *
     * @param bytes
     * @return
     */
    public static int bigEndian(byte[] bytes) {
        //System.out.println(String.format("%32s", Integer.toBinaryString(bytes[3]&0XFF)).replaceAll("\\s", "0"));
        //System.out.println(String.format("%32s", Integer.toBinaryString(((bytes[2]&0XFF) << 8)).replaceAll("\\s", "0")));
        //System.out.println(String.format("%32s", Integer.toBinaryString(((bytes[1]&0XFF) << 16)).replaceAll("\\s", "0")));
        //System.out.println(String.format("%32s", Integer.toBinaryString(((bytes[0]&0XFF) << 24)).replaceAll("\\s", "0")));

        return (bytes[3]&0XFF)
                | ((bytes[2]&0XFF) << 8)
                | ((bytes[1]&0XFF) << 16)
                | ((bytes[0]&0XFF) << 24);
    }

    /**
     * 大端序 int转字节数组
     *
     * @param i
     * @return
     */
    public static byte[] bigEndian(int i) {
        int byte1 = i & 0XFF;
        int byte2 = (i & 0XFFFF) >>> 8;
        int byte3 = (i & 0XFFFFFF) >>> 16;
        int byte4 = (i & 0XFFFFFFFF) >>> 24;
        return new byte[]{(byte) byte4, (byte) byte3, (byte) byte2, (byte) byte1};
    }

    /**
     * 小端序 int转字节数组
     *
     * @param i
     * @return
     */
    public static byte[] littleEndian(int i) {
        int byte1 = i & 0XFF;
        int byte2 = (i & 0XFF << 8) >> 8;
        int byte3 = (i & 0XFF << 16) >> 16;
        int byte4 = (i & 0XFF << 24) >> 24;
        return new byte[]{(byte) byte1, (byte) byte2, (byte) byte3, (byte) byte4};
    }

    public static void main(String[] args) {
        int a = new Random().nextInt();
        String s = String.format("%32s", Integer.toBinaryString(a)).replaceAll("\\s", "0");
        System.out.println("原数据:             " + s.substring(0, 8) + " " + s.substring(8, 16) + " " + s.substring(16, 24) + " " + s.substring(24, 32) + " ");

        byte[] bytes = bigEndian(a);
        System.out.printf("大端序-int转字节数组:");
        for (int i = 0; i < bytes.length; i++) {
            System.out.print(String.format("%8s", Integer.toBinaryString(bytes[i] & 0XFF)).replaceAll("\\s", "0") + " ");
        }
        System.out.println();
        System.out.println("大端序-字节数组转int验证:" + (bigEndian(bytes) == a));

        byte[] bytes2 = littleEndian(a);
        System.out.printf("小端序-int转字节数组:");
        for (int i = 0; i < bytes2.length; i++) {
            System.out.print(String.format("%8s", Integer.toBinaryString(bytes2[i] & 0XFF)).replaceAll("\\s", "0") + " ");
        }
        System.out.println();
        System.out.println("小端序-字节数组转int验证:" + (littleEndian(bytes2) == a));
    }
}

原数据:             10010100 11111001 01101110 00100011
大端序-int转字节数组:10010100 11111001 01101110 00100011
大端序-字节数组转int验证:true
小端序-int转字节数组:00100011 01101110 11111001 10010100
小端序-字节数组转int验证:true

高低位和byte转int

最近研究I/O流,发现read()方法返回的是int类型,原来是将一个byte读入到一个int,有效的数据只占据int型变量的最低8位。在正常情况下这个int型的变量永远都不可能是负数。

什么是高低位?

一个Byte是8位(bit),其中的“8位”指的是8位2进制数。byte范围是-128--127,如果输入超过这个数值,会编译错误。

如8位二进制数:11001010;1100就是高4位,后面的1010就是低4位。

什么是低8位?

一个int类型的变量能存放4Byte,也就是能存放32位二进制数,而一个32位二进制数中权值最大的24位就是高24位,那么剩下的就是低8位。

如何将byte转换为int?

需要将前24位去除,也就是转换为0。Java对byte总是做有符号处理;

所以可以通过将byte和0xff进行二进制“&“得到它的无符值。

例如:

byte的二进制为:11001010;

0xff的二进制为:11111111;

1111111111111111111111111 11001010 & 11111111 = 000000000000000000000000 11001010

上面的例子为什么会添加这么多“1”?

当系统检测到byte可能会转化成int或者说byte与int类型进行运算的时候,就会将byte的内存空间高位补1(也就是按符号位补位)扩充到32位

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 实现取int型的第二个字节的数

    目录 取int型的第二个字节的数 1.首先创建 Bytebuffer 2.通过位运算计算 3.附一个int转byte数组 int的取值范围 例如7的二进制表示形式为 例如-7的二进制表示为 取int型的第二个字节的数 无意中看到某个题目,前提条件,一个byte最多表示256位,因为其是由8个位表示 ,八个1 最多表示256位. 一个int由32位组成,所以是4个byte表示.题目要求是给定一个int数字,问第二个byte是多少.刚开始不会写. 再后来复习nio时,突然想到这题. 1.首先创建 B

  • 在Java中将double转换为int的操作方法

    在本文中,我们将看到如何将double转换为int. 在Java编程中,您将有一个double原语值(例如82.14),但是要执行进一步的操作,您需要一个int值(例如82),所以让我们看看如何在Java中将double转换为int. 您可以通过三种方式将double转换为int.我将在下面列出所有内容,然后我们将一一列出. 1,将double转换为int -使用类型转换 2,将double转换为int -使用 Math.round() 3,将double转换为int -使用 Double.In

  • 解释:int型默认值为0的问题

    目录 解释:int型默认值为0 但我们尝试发现并不能通过: 原因: int的默认值为0,而Integer的默认值为null 尤其在java 中声明时: 解释:int型默认值为0 在java书中往往强调:如果没对int型赋初值,默认是0. 但我们尝试发现并不能通过: public class test{ public static void main(String args[]){ int i; System.out.println(i); } } 提示: 1 个错误 JobsdeMacBook-

  • java 实现将Object类型转换为int类型

    如何将Object类型转换为int类型 Object object = null; try { Integer.parseInt(object.toString()); } catch (NumberFormatException e) {} 也可以先判定一下是否是Integer //可以先判定一下是否是Integer Object object = "111"; if (object instanceof Integer) { Integer.parseInt(object.toSt

  • Java中int和Integer的区别

    目录 1.基本数据类型 2.包装类及其作用 2.1包装类的作用 3.int 和 Integer 的区别 4.总结 重要说明:本篇为博主<面试题精选-基础篇>系列中的一篇,查看系列面试文章请关注我. Gitee 开源地址:gitee.com/mydb/interv- nJava 是一种强数据类型的语言,因此所有的属性必须有一个数据类型.就像麦德龙超市一样,想要进去购物,先要有一个会员卡才行(刷卡入内).​ PS:Java 10 有了局部变量类型推导,可以使用 var 来替代某个具体的数据类型,但

  • Java int类型如何获取高低位

    目录 int类型如何获取高低位 大小端序 获取int的高低位字节数组 高低位和byte转int 什么是高低位? 什么是低8位? 如何将byte转换为int? int类型如何获取高低位 去年笔者和一个硬件厂商调试打印机的时候遇到这个一个问题,厂商需要打印报文中传输报文的长度标志,按大端序,将长度的高位和低位放到两个字节里,笔者由于基础知识不牢固,在这个问题上浪费了较长时间,今年开始写博客了,就记录一下这个问题.笔者使用了int来记录长度,其实应该用两个字节的short来记录,这样更简单. 大小端序

  • java int类型二维数组实现“杨辉三角”的完整实例

    杨辉三角的规律: 1.每行的数据个数和在第几行一样. 2.每行第一个数和最后一个数都是1. 3.每行除了第一个数据和最后一个数据 其他数据的值等于上面一行的对应列的值和左对角值的和.例如:a[2][1]=a[1][0]+a[1][1] 根据上面的规律我们设计程序 private static void demo(){ int[][] ints = new int[10][]; //动态给ints数组的一维赋值一个不同的数组 for (int i = 0; i < ints.length; i++

  • Java 字节数组类型(byte[])与int类型互转方法

    代码如下: public class CommonUtils { //高位在前,低位在后 public static byte[] int2bytes(int num){ byte[] result = new byte[4]; result[0] = (byte)((num >>> 24) & 0xff);//说明一 result[1] = (byte)((num >>> 16)& 0xff ); result[2] = (byte)((num >

  • 基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形int转换成byte数组,同时如何把一个长度为4的byte数组转换为int类型.下面有两种方式. public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[0] = (byte) (res & 0xf

  • Android中Java根据文件头获取文件类型的方法

    本文实例讲述了Android中Java根据文件头获取文件类型的方法.分享给大家供大家参考,具体如下: 前面讲过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好.具体可查看Android系统使用MediaFile类判断音频文件类型.其实,获取文件类型最好的办法便是根据文件头信息来判断.下面贴出相关代码: public class FileType { public static final HashMap<String, Str

  • java 从int数组中获取最大数的方法

    首先要有数组的概念吧,知道什么是数组,简单讲就是存放一组数据的一个组合,就是一个数组....哈哈 已知一个int数组, 编程从数组中获取最大数. 思路分析: 1.一个数组可能有很多个数字,要取最大数,那就是一个数一个数的进行比较可以可以选出来了是吧 那么就是:先定义一个变量赋值为数组的第一个数,然后在和数组的第二.第三个数相比较,遇到比自己大的就将打的数值赋给这个变量,遍历到最后就可以了. 代码: package com.itheima; /** * 2. 已知一个int数组, 编程从数组中获取

  • Java形参和实参的实例之Integer类型与Int类型用法说明

    经常会有这样一道面试题,有两个整形变量分别是a = 1 ,b = 2.编写一个方法swap互换他们的值. 
class
 
Main
 
{


 
public
 
static
 
void
 main
(
String
[]
 args
)
 
{


 
Integer
 a 
=
 
1
;


 
Integer
 b 
=
 
2
;


 
System
.
out
.
println
(
"a="
 
+
 a 
+
 
",b="
 
+
 b


  • 使用Java代码将IP地址转换为int类型的方法

    基本知识点    IP --> 整数: 把IP地址转化为字节数组 通过左移位(<<).与(&).或(|)这些操作转为int 整数 --> IP: 将整数值进行右移位操作(>>>),右移24位,再进行与操作符(&)0xFF,得到的数字即为第一段IP. 将整数值进行右移位操作(>>>),右移16位,再进行与操作符(&)0xFF,得到的数字即为第二段IP. 将整数值进行右移位操作(>>>),右移8位,再进行与操

  • java中long数据类型转换为int类型

    由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出情况: 主要以下几种转换方法,供参考: 一.强制类型转换 long ll = 300000; int ii = (int)ll; 二.调用intValue()方法 long ll = 300000; int ii= new Long(ll).intValue(); 三.先把long转换成字符串String,然后在转行成Integer long ll = 300000; i

随机推荐