java inputStream中的int转byte和byte转int的方式和注意事项

c++实现异步线程池并详细分析线程池析构流程 多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。 阅读详情

小知识:

byte (8位),short(16位),int (32位),long(64位)  此处只列整数

有符号位的第一位表示符号,0 表示 正,1 表示 负 

正数的反码:与原码相同

负数的反码:原码的符号位不变,其他位取反

正数的补码:与原码相同

负数的补码:反码+1

整数的正数在内存中显示的跟源码一样,如. int i = 1; i 在内存中就是 00000000 00000000 00000000 00000001

整数的负数在内存中显示的是补码,补码 = 反码 + 1,如 -1 的源码是 10000000 00000000 00000000 00000001,那么它的反码就是 11111111 11111111 11111111 11111110,那么它的补码就是 11111111 11111111 11111111 11111111。

正题:

int的二进制码查看:可以通过Integer.toBinaryString(num),该方法会返回int类型在内存中的二进制代码,注意 int 是32位的,正数显示的是源码,高位如果全是0的话会自动丢弃,所以脑补一下即可。

byte的二进制码查看:
 

public static String getByte(byte b) {
         
         return + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1)
                + (byte) ((b >> 5) & 0x1) + (byte) ((b >> 4) & 0x1)
                + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1)
                + (byte) ((b >> 1) & 0x1) + (byte) ((b >> 0) & 0x1) + "";
        /*
        *
         0x 表示16进制
         >> 表示右移 b >> 7 表示 右移7位(舍弃低6位)
         位与运算符(&):运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。 
         & 0x1 的意思是:该数值与16进制的1进行位于运算,作用就是 如果最低位是 1 就取 1 ,0 就取 0,目的是获取最低位。
        *
        * */
    }

介绍完基础后开始介绍输入流inputStream ,该类有一个重要的方法 read(),读取一个字节,并返回该字节,注意读取的是一个字节,也就是8位二进制代码,是无符号位的,取值范围是0~255 ,也就是低8位是读取的字节,其余的24位全是0 ,但是它把它放到一个int长度的数据类型中保存,根据强转规则,int 转 byte 会截取低 8位,所以 输入流中的 int 可以直接强转为 byte ,不会丢失数据。

即:int i = in.read(); byte b = (byte)i; 即可。

明白这个原理对打印日志什么的很方便,比如我想查看打印一个文件的内容,用以下代码即可(这样写只是方便理解):

public void input2(){
        try(InputStream in = new FileInputStream(new File("/Users/chengong/Desktop/test.txt"))){
            byte[] bytes = new byte[in.available()];
            int i;
            int j = 0;
            while((i = in.read()) != -1){
                bytes[j] = (byte)i;
                j ++ ;
            }
            String s = new String(bytes);
            System.out.println(s);
        } catch (Exception e){
            e.printStackTrace();
        }
    }

//---------------以上只是方便理解,实际小文本直接按下面代码就可以了

public void testInp(){
        try(InputStream in = new FileInputStream(new File("/Users/chengong/Desktop/test.txt"))){
            if(in.available()>0){
                byte[] bytes = new byte[in.available()];
                in.read(bytes);
                String s = new String(bytes);
                System.out.println(s);
            }
        } catch (Exception e){
            e.printStackTrace();
        }
    }

 

但是重点来了,byte转为int就有问题了,因为前面说过,数值在内存中是有符号的,byte转为int的时候会考虑符号位,如果符号位是0 那么强转后是正常的,如果符号位位1,那么强转位 int 就会导致强转后的int跟最初的int不一致,原理是:

假如输入流中读取的一个字节是 10000001,该数值是无符号位的,它表示 129,读出来的int是

00000000 00000000 0000000 10000001

强转为byte后只截取低8为,即 10000001,整数是有符号位的,该值是 -1 的源码。补码是 11111111。

那么该值再强转为int后就会考虑符号位,符号位保留,高位补 0 ,即 1000000 00000000 00000000 00000001。补码是32个1。

因为该值之前是 00000000 00000000 0000000 10000001,所以就出问题了。

那么怎么解决呢?

对强转前的byte做个判断,如果是正,即符号位为0,就直接强转,没问题。

如果是负,即符号为 1,就让该值与 11111111 11111111 11111111 00000000 进行位异或运算^ ,即 byte^-256。

位异或运算(^):两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。

11111111 11111111 11111111 10000001

^

11111111 11111111 11111111 00000000

=00000000 00000000 0000000 10000001。

 

所以 int i = byte > 0?byte:byte^-256; 即可。

也可以 int i =  byte > 0?byte:byte+256; 原理类似。

 

有些东西看似简单,原理还是有点复杂,仔细研究才能运用自如,文章纯属手敲,如有错误,欢迎斧正和批评,谢谢!

 

转载请注明出处,谢谢 !

 

 

 

 

 

 

Cadence IC5141保姆级教程:Bandgap电路四大仿真(稳定性/噪声/启动/PSRR)完整流程与调参心得 本文提供Cadence IC5141中Bandgap电路的四大仿真(稳定性仿真、噪声仿真、启动仿真、PSRR仿真)的完整流程与调参心得。从原理图检查到ADE L配置,详细解析各仿真步骤的关键参数设置与优化策略,帮助工程师高效完成电路设计与性能调优。 阅读详情

相关推荐

WSL2+Docker+Ollama:解锁Windows本地GPU加速运行DeepSeek-R1模型

本文详细介绍了在Windows系统上,通过WSL2、Docker和Ollama的组合方案,实现本地GPU加速运行DeepSeek-R1模型的全过程。该方案解决了Windows环境下Ollama默认无法调用NVIDIA显卡的痛点,通过配置Docker的GPU支持,强制将计算任务分配给GPU,从而显著提升文本生成速度与效率,为开发者提供了一个便捷的本地AI测试环境。

weixin_28452161的博客 358

Java按行读取InputStream,并提取出int。

下面以ExoPlayer的下载流为例,下载一个txt文件,读取它的内容,并将有效的数据提取出来。 DataSourceInputStream inputStream = new DataSourceInputStream(dataSource, dataSpec); try { inputStream.open(); ...

weixin_39970103的博客 3788

利用Virtuoso IC 618进行LDO稳定性分析与补偿设计

本文详细介绍了如何利用Virtuoso IC 618进行LDO稳定性分析与补偿设计。通过搭建仿真环境、运行STB分析诊断环路问题,并深入探讨密勒补偿、调零电阻等关键技术,帮助工程师在Virtuoso平台中高效完成LDO的稳定性优化与验证,确保芯片在各种工艺角下的鲁棒性。

weixin_29170327的博客 162

21.InputStream、高效字节流、字符流、转换流(InputStreamReader、OutPutStreamWriter)

一、InputStream 1.1.简介 字节输入流的超类 1.2常用方法 close、read 1.3子类 FileInputStream ObjectInputStream 1.4 FileInputStream 1.4.1简介 1.4.2构造方法 FileInputStream(String path) FileInputStream(File file) 1.4.3构造方法的两件事 ①实例化FileInputStream对象 ②将FileInputStream指向磁盘

故园风雨前的博客 1236

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节

本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。

e4f5g6h7的博客 438

CANoe基础讲解01:从零开始使用CANoe轻松搭建你的第一个CAN网络

本文是一篇CANoe软件入门实操指南,逐步演示了如何从零创建并运行一个CAN FD仿真工程。内容包括:启动软件、配置硬件通道与网络、加载DBC数据库、使用CAPL编写仿真节点发送CAN报文,最终启动测量并在Trace窗口中查看通信结果。通过七个清晰步骤,帮助初学者快速掌握CANoe基本操作,完成首个可运行的仿真网络搭建

车载网络小D的博客 1573

InputStream输入流转换成字节数组 和 字节数组转换成字符串

https://blog.youkuaiyun.com/night_iv/article/details/7525760?utm_source=blogxgwz5 https://www.cnblogs.com/yongdaimi/p/12367746.html 在commons-io包中org.apache.commons.io.IOUtils类的toByteArray(InputStream input)已经有实现了,我们可以参考下思路,完成我们的方法,我们可以用类似下面的代码实现inputStream转化为byt

weixin_45624150的博客 868

springboot源码 红色J_通达信副图指标源码之,出手就赢

今天跟大家分享一个通达信副图指标源码,本指标没有未来函数,因为本指标没有卖点提示,所以本指标需配合主图指标使用效果会更好,简单易懂,很容易明白,所以就不过多介绍使用方法了,以下是指标的贴图。风险提示!股市有风险买卖需谨慎,本指标只做参考建议,不做买卖交易结果,自己要对自己交易结果的盈亏负责,以下是指标的源码。VAR2:=REF(LOW,1);VAR3:=SMA(ABS(LOW-VAR2),3,1)...

weixin_39859909的博客 2848

字节输出流_OutputStream类&FileOutputStream类介绍

package com.learn.demo01.OutputStream; import java.io.FileOutputStream; import java.io.IOException; /* java.io.OutputStream:字节输出流 此抽象类是表示输出字节流的所有类的超类。 定义了一些子类共性的成员方法: - pub...

Leon_Jinhai_Sun的博客 817

【01】VisionMaster入门到精通——VisionMaster V4.0.0 试用版安装教程(安装试用补丁与试用授权)

本文详细介绍了海康VisionMaster 4.0.0试用版的安装步骤:首先从官网下载基础安装包、软加密试用版和示例程序(可选);安装时需按顺序完成主程序安装(选择软加密)、试用补丁安装和30天试用授权安装;最后提供了两种启动方式。文章还列出了试用版的7项功能限制,包括最多支持2个流程、2个全局相机等,并特别提醒试用版不维护、不提供补丁,建议用户转为正式版本。安装过程中若出现蓝屏需重启覆盖安装,授权失败时可参考指定解决方案。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 8934

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

如何从InputStream获取完整长度的字节数组

上面是正常从InputStream读取数据指定一个1024可能不太符合某些业务情况,特别是从网络获取到数据时。每次写IO的时候都忘记,写个笔记防止忘记。如何准确指定长度捏?

Wait_For_Loading的博客 1356

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1624

InputStream

在 Java 的 I/O 流体系中,InputStream 类位于 java.io 包下,是所有字节输入流的超类。调用任何read()方法后,读到的数据会从stream中流出,不再保存在stream中。

1221

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

InputStream read()方法详解

在Java7中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。   查阅Java7 API,我们可以看到,在InputStream中定义了三个重载的read()方法:   但是在这三个方法中,只有参数列表为空的read方法定义为抽象方法,这也就意味着在直接继承自InputStream的所有子类中,必须重写这个方法。下面我们来看看这个方法的介绍:   这里有两点需要注意:一是这个方法的返回

to_real的博客 7010

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java中byte, int的转换

http://talentluke.iteye.com/blog/1538764 最近在做些与编解码相关的事情,又遇到了byte和int的转换,看着那些关于反码、补码的说明依旧头疼,还是记下些实用的方法吧。 int -> byte 可以直接使用强制类型转换: byte b = (byte) aInt; 这个操作是直接截取int中最低一个字节,如果int大于255,则值就会变得面

爱自在的专栏 661

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【JAVA学习笔记】InputStream.read()三种方法解析

Read的三种方法 API reference: https://docs.oracle.com/javase/7/docs/api/ Read() 返回int值,0-255。 每次从数据源读取一个byte并返回。 read方法每次读取8哥二进制位(所谓一个byte字节。字节是十进制0-255之间的一个整数),所以read就是从数据源读取一个8位二进制数(一个byte),将这个byte转换为十进制整数然后返回)。 Read(byte[] b) 3. 返回int值,表示读取的字节数。 4. 使用一个byt

weixin_42627346的博客 6817

基于java的InputStream.read(byte[] b,int off,int len)算法学习!

public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组。尝试读取多达 len 字节,但可能读取较少数量。以整数形式返回实际读取的字节数。 在输入数据可用、检测到流的末尾或者抛出异常前,此方

ole_triangle_java的博客 891

java InputStream读取数据问题

首先请查看一下JavaAPI,可以看到InputStream读取流有三个方法,分别为read(),read(byte[] b),read(byte[] b, int off, int len)。其中read()方法是一次读取一个字节,鬼都知道效率是非常低的。所以最好是使用后面两个方法。 例如以下代码: Java代码   /**   * 读取流   *    * 

phenixyf的专栏 1356

Java 字节流InputStream、OutputStream、FileInputStream、FileOutputStream

InputStream  和OutputStream 第一种方式:使用字节输出流建立一个文件并存储一些数据 FileOutputStream fos = new FileOutputStream("fos.txt"); fos.write("abcdsjfl".getBytes()); //getBytes()将字符串转化成字节存储到byte数组中 fos.close(); /

IT_驿站 1037

InputStream read 方法需要注意的地方

因为做毕业设计的需要,要用到 InputStream ,需要自己实现一个 InputStream 。因为 InputStream 是抽象类,已经有骨架实现,只需要实现 int read() 方法即可。 一开始是这样写的, [code="java"] public int read(){ //此处略去若干字 byte b=... //此处略去若干字 r...

bastengao的专栏 196

InputStream的三个read的区别

1.read 这个方法是对这个流一个一个字节的读,返回的int就是这个字节的int表示方式 以下是代码片段,经过测试当eclipse的编码为gbk时,转化出的字符串不需经过重新编码,如果eclipse的编码为utf-8时则由byte转成字符串需重新编成utf-8的 InputStream in = Test.class.getResourceAsStream("/tt.txt");

msdn789的博客 360

为什么InputStream的read()返回-1可以表示结束

4个字节中的前面3个字节全变成0,只保留最后一个字节的值。所以如果从输入流中读取一个字节,如果这个字节的值刚好是。基础时应该都有学到,两个类型不同的数值进行计算时,低类型会转为高类型再进行计算的,所以。之后都会是一个正整数,不可能是负数,它的范围是0 ~ 255,这正好是无符号。它相当于把一个可正可负的byte值变成了一个绝对是正数的int值,所以。如上代码,把输入流中读取到的数据写到输出流中,在。,也就是输入流读取的结果,但是它在返回之前有一个。完成的,所以我们看不到实现,今天我看了。

Android菜鸟的专栏 1883

【Java SE】文件操作与IO流

文章摘要: 文件系统是计算机存储管理的核心机制,将硬盘数据抽象为文件和目录。Java通过File类操作文件元数据(路径、权限等),但不支持内容读写。文件读写需使用IO流体系:字节流(InputStream/OutputStream)处理所有文件类型,字符流专用于文本文件。FileInputStream读取文件时需注意资源释放,推荐使用try-with-resources语法自动关闭流。文件操作涉及路径处理(绝对/相对路径)、状态判断和目录遍历等功能,是编程中基础且重要的技能。

记录了从0学习Java技术栈的日常 354

java中 File类 和 IO流相关操作

java中 file类 和 io 流 相关操作

xgq_111的博客 555

java反射和java注解

反射 框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 反射:将java代码的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,这就是java的反射 机制,如下图。 反射的好处: 可以在程序运行过程中,操作这些对象。 可以解耦,提高程序的可扩展性。 获取class对象的方式 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 // 通过指定的字符串路径获取 // 多用于配置文件

梦想是很难很难的,所以先勇敢一点 1833
上一篇: 通过AOP获取方法参数名的方法详解
下一篇: java手撕红黑树,左旋、右旋、变色、及红黑树的设计概念
敕令
博客等级 码龄10年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值