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

【MATLAB强化学习工具箱】学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent Simulink中便于搭建各类动力学与控制模型,通过将原有的控制器替换为AI控制器,可以方便使用已有模型,提供增量效果。 本节的重点是如何引入Simulink模型作为env,其他的内容在之前的文章中已有说明。 以水箱模型watertank为例,如下图所示: 采用PI控制器,控制效果如下所示: 将此PI控制器替换为神经网络控制器后,系统架构如下图所示: 具体替换策略如下所示: (1)删去PID控制器; (2)增加RL Agent模块; (3)观测器模块: 观测向量为:,其中... 阅读详情

小知识:

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; 原理类似。

 

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

 

转载请注明出处,谢谢 !

 

 

 

 

 

 

CS之攻击菜单详解-后门生成与上线 能够生成如HTA文档、office宏、payload生成器、exe程序。 windows可执行程序exe 可以看到能生成两种windows可执行程序,其分别代表stage分阶段和unstage(stageless)不分阶段。传送门 ——>Cobalt Strike中payload的stage与unstage区别 选择监听器后,按需生成不同类型的exe 然后在目标机器运行即可上线 payload生成器 选择生成如下类型的后门 ——>https://che... 阅读详情

相关推荐

短视频mssdk中get_token协议逆向与加密流程深度解析

本文深度解析了短视频mssdk中get_token协议的逆向分析与加密流程。通过抓包、Frida Hook、静态分析等手段,详细拆解了协议数据的Protobuf结构、设备信息采集来源,并重点剖析了其核心加密链路:zlib压缩、自定义TEA算法与AES-CBC加密,最终实现完整的协议模拟。

flower的专栏 557

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

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

weixin_39970103的博客 3788

保姆级避坑指南:在Ubuntu 22.04上成功复现VMamba模型(附完整环境依赖清单)

本文提供了在Ubuntu 22.04上复现VMamba模型的详细指南,包括环境准备、CUDA与PyTorch的精确匹配、依赖安装的疑难杂症解决以及完整环境清单。特别针对Linux系统下的环境复现问题,提供了实用的避坑技巧和验证方法,帮助开发者高效完成VMamba模型的部署。

weixin_29083373的博客 263

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

声音事件检测metric:PSDS

这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。

Maestro_T的博客 2730

2021电子科技大学分布式系统期末考点精析与实战解析

本文深入解析2021年电子科技大学分布式系统期末考试核心考点,包括分布式事务、时钟同步、GFS架构等高频内容。基于回忆版试题,提供实战解析与应试技巧,帮助考生高效复习。重点涵盖两阶段提交、Cristian算法等关键技术,适合计算机专业学生备考参考。

weixin_29251131的博客 541

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

运动想象 (MI) 分类学习系列 (19) : EEG-TransNet

本文提出了一种基于注意力机制的卷积神经网络(EEG-TransNet),用于运动想象脑电图(MI-EEG)解码。该方法创新性地通过平均池化和方差池化提取多模态时间信息,并结合自注意力模块捕获长期依赖关系。消融实验表明,方差池化比最大池化更有效(p<0.05),且注意力模块和卷积编码器对特征判别性至关重要。可视化分析验证了该方法能学习到更具判别性的紧凑特征。该工作为MI-EEG解码提供了新的多尺度时间信息融合视角,代码已开源。

走在深度学习前沿的小宋 358

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

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

Leon_Jinhai_Sun的博客 817

PX4从放弃到精通(十九):串口驱动

文章目录前言一、创建进程二、编写驱动 前言 硬件: PIXHAWK4 USB转串口模块 软件: Ubuntu18.04 PX4 1.11.3固件 QGC地面站 串口助手 一、创建进程 参考:https://mbot1.blog.youkuaiyun.com/article/details/122587617 二、编写驱动 .........

超维空间科技的博客 4600

机器学习项目实战案例数据集

本专栏整理了《机器学习项目实战案例》,内包含了各种不同的机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 3640

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

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

Wait_For_Loading的博客 1356

016、自动标注方案实战:用大模型(SAM/Grounding DINO)生成 YOLO 格式伪标签

本文介绍了一种利用大模型自动生成YOLO格式伪标签的实战方案。针对传统人工标注效率低、易出错的问题,作者提出结合Grounding DINO(零样本检测)和SAM(精细分割)的优势:前者快速生成候选框,后者优化边界精度。文章详细阐述了技术选型理由(平衡速度与精度)、环境搭建避坑指南(关键依赖版本)、核心三步流程(检测-分割-格式转换)以及后处理技巧(置信度分级过滤)。实验表明,该方案相比纯人工标注可节省80%时间,且经过SAM优化的边界框精度提升10-15%。特别强调了工程细节:文本描述格式、阈值设定、小目

zzfmlxs的博客 544

InputStream

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

1221

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

InputStream read()方法详解

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

to_real的博客 7010

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java中byte, int的转换

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

爱自在的专栏 661

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【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、付费专栏及课程。

余额充值