Java的Byte都是有符号的(singed),而Byte又是8位的,如何转为无符号( unsigned)的呢?
素材:
byte a=11010110 (singed : -42 、 unsigned :214)
尝试:
方法一:直接转-- (int)a (失败)
转换前 11010110
(转换,牵涉到符号位的扩展。因为扩展前符号位是1,所以扩展后,高位都是1)
转换后 11111111 11111111 11111111 11010110 ( - 42 )
原码--- 补码 转换
各位取反,在加1,转换成 原码
11111111 11111111 11111111 11010110
(符号) 负
(取反) 00000000 00000000 00000000 00101001
(加1 ) 00000000 00000000 00000000 00101010
方法二:通过IO流 (成功)
我常用IO流来进行一些 进制的转换 。
O(∩_∩)O~
import java.io.ByteArrayInputStream;
public class Test{
public static void main(String[] args) {
byte[] bytes = new byte[]{(byte)-42};
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
int result = in.read();
System.out.println("无符号数: \t"+result);
System.out.println("2进制bit位: \t"+Integer.toBinaryString(result));
}
}
输出
无符号数: 214
2进制bit位: 11010110
方法三:当然是看看 ByteArrayInputStream 的源码了。
ByteArrayInputStream的read源码:
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
原来是 & 运算呀!!!
修改IO的方式的写法:
public class Test{
public static void main(String[] args) {
byte bytes = -42;
int result = bytes&0xff;
System.out.println("无符号数: \t"+result);
System.out.println("2进制bit位: \t"+Integer.toBinaryString(result));
}
}
稍微解释一下:
(byte) -42
& 0xff
STEP01:(byte)-42
进行扩展:
11111111 11111111 11111111 11010110
STEP02:与运算:
00000000 00000000 00000000 11111111 ( 0xff 也是 0x000000ff)
&
11111111 11111111 11111111 11010110
结果:
00000000 00000000
00000000 11010110 (即是整数214)
之所以会弄这个古怪的的问题,是因为我想得到中文字符串的byte流的二进制形式。想窥探一下不同的编码集的异同。
记录一下:
常
读JDK源码,很有收获!!
分享到:
相关推荐
在Java编程中,`Byte`和`Integer`都是表示整数的数据类型。`Byte`占用一个字节(8位),取值范围为-128到127,而`Integer`则占用四个字节(32位),取值范围大大扩展至-2^31到2^31-1。在实际开发中,如果数据库字段...
在Java中,byte是一个8位的有符号整型数据,它的取值范围是-128到127。int是一个32位的有符号整型数据,取值范围是-2,147,483,648到2,147,483,647。由于byte与int的数据位数不同,转换时需要进行特定的处理。 **...
Java 中的基本类型与 byte 数组之间的转换是非常重要的,以下是关于 Java 基本类型与 byte 数组互相转换的相关知识点: 1. short 类型转换成 byte 数组 在 Java 中,short 类型是 16 位的整数类型,而 byte 数组是...
在Java中,一个`int`型数据占用4个字节(32位)。因此,从`byte[]`转换到`int`,我们需要确保数组长度至少为4,并按照字节顺序(通常为大端或小端)正确组合字节。这里我们假设默认的大端序: ```java public ...
本文档主要探讨了如何在Java中实现这两种数据类型的转换,包括有符号和无符号的转换。 首先,Integer在Java中占用4个字节(32位),其中最高位作为符号位。如果最高位是1,表示这是一个负数;如果是0,则表示正数。...
用于java,byte与各种对象的转换,Integer、short、hex、string
在C#中,`byte`类型是一个无符号8位整数,其取值范围是0到255。而`int`则是一个有符号32位整数,范围为-2^31到2^31-1。由于`byte`是无符号的,它无法直接表示负数,因此在处理温度等可能为负的数值时,我们需要通过...
在Java编程中,经常需要处理图像数据,特别是在网络传输或存储时,将图像转换为`byte`数组是一种常见的做法。这不仅可以提高传输效率,还可以方便地进行存储。本文将详细介绍如何使用Java将图片转换为`byte`数组以及...
ip地址转4字节byte,char转2字节byte,byte数组转char,int整数转换为4字节的byte数组,byte数组转换为int整数,double类型转8字节数组,8位数组转...byte数组转换为无符号short整数,byte数组转换为无符号short整数
在Java中,byte数组可以被用来存储short类型的值,因为一个short占用两个字节。`putShort`和`getShort`方法用于在字节数组中写入和读取short值。这两个方法内部都采用了位移操作来完成转换。例如,`putShort`方法...
VB中的Integer数据类型通常占用2字节,与C中的short或int相当,而VB的UInteger或Long数据类型可能对应C中的无符号整数(unsigned int)或长整数(long)。因此,"2字节装换为1个整数"可能指的是将两个VB的Integer...
本文将深入探讨如何在Java中实现两个`byte`数组的合并,以及一些相关的操作,如数组反转和加密。 首先,我们来看一下标题和描述中提到的示例代码。这个简单的函数`addBytes`接收两个`byte`类型的数组`data1`和`data...
为了更好地理解这些概念,可以参考"**S7-200SMART PLC中无符号数据转换+比较+运算(子程序可重复调用)**"这个压缩包文件中的示例程序。这个文件可能包含了具体的梯形图代码和注释,通过实例展示了如何在实际应用中...
使用链式编程写法实现Java中byte数组的拼接。例如byte[] bytes = ByteUtils.get().add(0x41).add(07).add(11).add("15288930000").add(0x45).toArray();更灵活用法请参考Mybytes
java中把对象转化为byte数组的方法 Java 中将对象转化为 byte 数组的方法是指将 Java 对象序列化为二进制数据流,以便在网络上传输或存储。这种方法可以应用于各种领域,如分布式计算、网络通信、数据存储等。 在 ...
下面,我们将深入探讨如何在Java中实现图像数据与字节数组之间的相互转换,并分析这一过程中的关键步骤和技术细节。 ### 转换Image数据为byte数组 #### 方法一:`imageToBytes`函数解析 在Java中,将`Image`对象...
在Java编程中,String对象和Byte...总之,Java中的String与Byte类型的转换是编程中不可或缺的部分,尤其在网络编程中,理解这两种类型之间的转换方式及其在网络数据交换中的作用,对于编写高效、可靠的程序至关重要。
我们使用 Java 的 Integer.toHexString 方法来将 byte 数组中的每个元素转换为 16 进制字符串,并使用 StringBuilder 来拼接这些字符串。 在 hex2Byte 方法中,我们将 16 进制字符串转换回 byte 数组。我们使用 ...
### Java中的char与byte的区别详解 #### 一、引言 在Java编程语言中,`char` 和 `byte` 是两种基本的数据类型,它们分别用于处理字符和数值数据。尽管这两种类型都用来存储数据,但它们之间存在着显著的差异。本文...