iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中的byte & 0xff到底有什么作用?
  • 683
分享到

Java中的byte & 0xff到底有什么作用?

2024-04-02 19:04:59 683人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

如果写过通信类的代码,比如Socket编程,应该对这个问题不陌生。 先说结论 byte & 0xff 是将byte从(-128 至 127)转化成 int(转化后的

如果写过通信类的代码,比如Socket编程,应该对这个问题不陌生。

先说结论

byte & 0xff 是将byte从(-128 至 127)转化成 int(转化后的数值范围: 0 至 255)。

其实就是1个byte有两种表示方法,我们既可以用-128 - 127这段范围来表示一个字节,也可以用 0 - 255这个范围的数来表示一个字节。

看一个demo

用Java中的InetAddress类来获取我当前的ip


public class InetAddressTest { 
    public static void main(String[] args) throws UnknownHostException {
        InetAddress localHost = InetAddress.getLocalHost();
        byte[] address = localHost.getAddress();
        for (byte b : address) {
            System.out.print(b + " ");
        }
    }
}

输出结果

-64 -88 2 119

本机ip

好像不太一样,我们ip地址只用 0 - 255来表示,不会出现负数。

所以再换一种写法,将取出来的字节 & 0xff


public class InetAddressTest { 
    public static void main(String[] args) throws UnknownHostException {
        InetAddress localHost = InetAddress.getLocalHost();
        byte[] address = localHost.getAddress();
        for (byte b : address) {
            System.out.print( ( b & 0xff ) + " ");
        }
    }
}

结果

192 168 2 119

Process finished with exit code 0

果然就是我们想要的结果

为什么需要转换

因为Java中的byte是有符号的,他的范围只能是 -128 - 127。

我们在使用tcp等协议的时候,首先要把传输的消息转化成字节流,然后再传输,在编程语言中字节流通常用十进制的byte数组来表示。

假如我们就想用 0-255来表示一个字节,不想用负数,该怎么办呢?

可惜Java中没有 无符号字节(unsigned byte), 我们只能用 int 来存储0-255。

而int的范围是(-2^31 ~ 2^31-1),只用了256个,剩下的空间都被浪费了,得不偿失啊。

所以我们存储的时候、传输的时候可以用byte,但是使用的时候就需要做一个转换了,那为什么0xff就可以得到无符号byte呢。

& 0xff的作用

作为一个十六进制数,0xff在Java中是用什么类型存储的呢?

应该显而易见吧,0xff是整型。

假设我现在要转化 字节 -1

-1的原码、反码、补码分别如下:


原码  1 0 0 0  0 0 0 1
反码  0 1 1 1  1 1 1 0
补码  0 1 1 1  1 1 1 1

现在和 0xff做运算, ff 就是(1111 11111),而因为他是整型,占4个字节,32为,所以0Xff的前面还有24个0。

用 -1 的补码进行计算


-1                                      0 1 1 1  1 1 1 1
0xff     000000000 000000000 000000000  1 1 1 1  1 1 1 1
=        000000000 000000000 000000000  0 1 1 1  1 1 1 1
=        255

其实在Java中,”任何数 & 0Xff等于那个数本身“ 这句话就显得不那么正确了

”任意整型 & 0xff = 本身“ 是没有问题的

但是字节 & 0xff 就被拖到了另一个次元,从byte进化成了int。

关于byte[ ] & 0xFF的问题

最近在写有关SHA256加密解密的问题,发现有一段代码是这样的,处于好奇理解了一下。


private static String byte2Hex(byte[] bytes){
  StringBuffer stringBuffer = new StringBuffer();
  String temp = null;
  for (int i=0;i<bytes.length;i++){
   temp = Integer.toHexString(bytes[i] & 0xFF);
   if (temp.length()==1){
    //1得到一位的进行补0操作
    stringBuffer.append("0");
   }
   stringBuffer.append(temp);
  }
  return stringBuffer.toString();
 }

Integer类中toHexString方法的参数是int类型,为什么byte[ ] & 0xFF可以表示int类型呢?

byte[i]是8位二进制,0xFF转化为8位二进制为11111111,& 之后的结果还是本身啊,这是怎么回事?

我们都知道计算机内的存储都是利用二进制的补码进行存储的。

复习一下,原码反码补码这三个概念

对于一个字节的最高位,计算机中是有规定的,正数的最高位为0,负数的最高位为1。

对于正数(00000001)原码来说,首位表示符号位,反码 补码都是本身

对于负数(100000001)原码来说,反码是对原码除了符号位之外作取反运算即(111111110),补码是对反码作+1运算即(111111111)

下面写段代码测试


public static void main(String[] args) {
  byte[] a=new byte[10];
  a[0]=-127;
  System.out.println("a[0]:"+a[0]);
  int b=a[0] & 0xFF;
  System.out.println("b:"+b);
 }

得到的结果为:

a[0]:-127

b:129

现在针对这个结果进行分析:

byte类型的a[0]的值为-127,在计算机中存储的补码为:10000001,这个补码是8位的,而int类型是32位的,所以a[0]作为int类型来输出的时候JVM给做了个补位便成了 111111111111111111111111 10000001(-127),虽然补码转换了,但是这两个补码表示的十进制数字是相同的。

为了保证二进制数据的一致性,当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,如果二进制被当作byte和int来解读,其10进制的值必然是不同的,因为符号位位置已经发生了变化,而&0xFF可以将高的24位置为0,低8位保持原样。

int b = a[0]&0xff; a[0]&0xff=1111111111111111111111111 10000001&11111111=000000000000000000000000 10000001 ,这个值就是129

所以最后显示的b的值为129

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

--结束END--

本文标题: Java中的byte & 0xff到底有什么作用?

本文链接: https://www.lsjlt.com/news/128949.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的byte & 0xff到底有什么作用?
    如果写过通信类的代码,比如socket编程,应该对这个问题不陌生。 先说结论 byte & 0xff 是将byte从(-128 至 127)转化成 int(转化后的...
    99+
    2024-04-02
  • java中byte的作用是什么
    java中byte的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和...
    99+
    2023-06-14
  • 浅谈Thread.sleep(0)到底有什么用
    我们可能经常会用到Thead.sleep()函数来吧使线程挂起一段时间。但是你真的了解这个函数的真正作用吗? 先思考两个问题: 假设现在是 2022-5-26 12:00:00.00...
    99+
    2024-04-02
  • java中byte有什么用
    这篇文章给大家介绍java中byte有什么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请...
    99+
    2023-06-14
  • java中byte的作用有哪些
    这篇文章给大家介绍java中byte的作用有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据...
    99+
    2023-06-14
  • Java的Lock接口到底有什么用
    本篇内容介绍了“Java的Lock接口到底有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!并发编程的关键是什么,知道吗我淡淡一笑,还好...
    99+
    2023-06-15
  • String() 字符串到底有什么作用?
    编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天编程网就整理分享《String() 字符串到底有什...
    99+
    2024-04-05
  • Kotlin中的contract到底有什么用详解
    目录前言测试总结前言 我们在开发中肯定会经常用Kotlin提供的一些通用拓展函数,当我们进去看源码的时候会发现许多函数里面有contract {}包裹的代码块,那么这些代码块到底有什...
    99+
    2024-04-02
  • 云服务器是什么东西?到底有什么作用
    云服务器是一种虚拟服务器软件,通常是由大型计算机公司或云计算服务提供商提供,用来管理和托管各种类型的计算资源,如大型服务器、虚拟存储设备、操作系统等。云服务器具有以下的作用:节省成本:云服务器通常会使用大型机或者服务器集群进行集中管理和运营...
    99+
    2023-10-25
    有什么 是什么东西 作用
  • 云服务器是什么东西?到底有什么作用呢
    云服务器是一种虚拟的数据中心基础设施,它允许用户将数据存储在云中,并由公有云提供商进行管理和处理。云服务器提供了多个功能,包括容错能力、弹性伸缩、高可用性、快速备份和远程访问等。 云服务器是一种广泛用于企业和机构的计算基础设施,用于支持大...
    99+
    2023-10-26
    有什么 是什么东西 作用
  • 一文讲解Kotlin中的contract到底有什么用
    目录前言测试查看 contract 函数returnscallsInPlace总结前言 我们在开发中肯定会经常用Kotlin提供的一些通用拓展函数,当我们进去看源码的时候会发现许多函...
    99+
    2024-04-02
  • 数据类型在编程中的作用到底是什么?
    在编程中,数据类型是非常重要的概念。数据类型是指变量或常量可以存储的数据的类型。在不同的编程语言中,数据类型的定义和使用都有所不同。但是,不管是什么编程语言,数据类型都是编程中的基础。 数据类型在编程中的作用主要有以下几个方面: 内存的...
    99+
    2023-10-27
    ide 数据类型 laravel
  • java中的finally有什么作用
    在Java中,finally是一个关键字,用于定义一个代码块,该代码块始终会被执行,无论是否发生异常。finally块通常用于释放资...
    99+
    2023-10-11
    java
  • hive中的几种join到底有什么区别
    目录数据:1. left join2. join3. full join4. Join…on 1=15. union6. union allunio...
    99+
    2024-04-02
  • java中encodeuricomponent有什么作用
    在Java中,encodeURIComponent方法用于编码URL中的特殊字符,以便它们可以被安全地传输。例如,如果URL中包含特...
    99+
    2024-03-07
    java
  • java中finally有什么作用
    在Java中,finally关键字用于定义一个代码块,该代码块中的代码无论是否发生异常都会被执行。finally有以下几个作用:1....
    99+
    2023-10-08
    java
  • Java中的BigDecimal类有什么作用
    本篇内容主要讲解“Java中的BigDecimal类有什么作用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的BigDecimal类有什么作用”吧!前言我们都知道浮点型变量在进行计算的...
    99+
    2023-06-16
  • JAVA中的Collection FrameWork有什么作用
    这篇文章主要讲解了“JAVA中的Collection FrameWork有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JAVA中的Collection FrameWork有什么作用...
    99+
    2023-06-03
  • Java中的封装有什么作用
    这篇文章主要讲解了“Java中的封装有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的封装有什么作用”吧!目录如何实现封装代码展示构造方法注意点:代码展示总结如何实现封装可...
    99+
    2023-06-20
  • java中接口有什么作用
    java中接口有什么作用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作