- 浏览: 744240 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (439)
- 生活小感 (9)
- Java (65)
- 笔面经 (18)
- 算法 (45)
- 读书笔记 (1)
- Android (147)
- 设计模式 (7)
- C语言 (7)
- 职业生涯 (6)
- 网络 (5)
- 数据库 (3)
- Linux/Unix (21)
- C++ (7)
- 思考 (3)
- WinPhone (4)
- Git (6)
- http (1)
- UML (1)
- SQL (2)
- Ant (1)
- iOS (14)
- FFmpeg (22)
- WebRTC (10)
- Mac (2)
- web (0)
- TCP (2)
- Vim (2)
- OpenSSL (1)
- OpenGL (6)
- 多媒体 (10)
- cocos2d (2)
- svn (1)
最新评论
-
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
WebSocket初探【转】 -
ding335306:
这个目录下没有找到此文件
eclipse.ini in MAC -
songshuaiyang:
哥们写东西可真乱啊
Android获取cpu和内存信息、网址的代码 -
zhoutao_temp:
这是自己能看懂还是让别人能看得懂,您就不能把版面稍微整理一下吗 ...
FFMPEG源码分析 -
chriszeng87:
string2020 写道git clone --bare表示 ...
复制git库
在Java中byte类型是有符号的,而Java中又没有提供无符号的byte类型,因此在其表示范围为-128-127之间。而这样对于一些I/O处理程序来说需要对考虑符号位问题,通常的做法可能是:
int unsignedByte = signedByte >=0 ? signedByte : signedByte + 256;
这里我们发现,由于byte的符号位的关系,我们不得不采用长度更长的int类型来处理符号位带来的问题。因此,我们会觉得byte由于要考虑符号位其范围变小了,所以,我们只好通过int来处理。在这个类型的转换过程中,任意长度的int类型会截断其高位的字节来适应byte类型,因为int类型要比byte类型宽。这也就是为什么一个int的127转换成了byte还是一个127。
不过,我们考虑另外一种情况,就是当一个int值大过byte表示的数值范围的时候,这个时候问题就出现了。比如,int的128转换成一个byte类型会是-128。这是因为补码运算的关系造成的。首先,128写成16进制是0x00000080,当做int到byte的类型转换的时候,前面的0被截断形成0x80。在二进制中0x80可以写成10000000,如果这是一个无符号数哪么一切正常,但是如果是一个有符号数就会经过补码运算。对于负数而言,其补码运算就是反码(就是1转换成0并且反正既然)加一。哪么,10000000的补码就是01111111加一,即10000000=128(十进制)。因此,byte0x80事实上表示的也
就是-128了。类似的int类型的129就是byte类型的-127,而int类型的130则是byte类型的-126,等等,直到int的255对应为byte的-1。
哪么如果到了256呢?此时,地位的字节被0来填充,简而言之256就是0x00000100。因此,转换成byte就是0,这个转换循环也就是256个。因此,我们根据上述原理,得出如下规律:
byte byteValue=0;
int temp = intValue % 256;
if ( intValue < 0) {
byteValue = (byte)(temp < -128 ? 256 + temp : temp);
}
else {
byteValue = (byte)(temp > 127 ? temp - 256 : temp);
}
上述过程中,我们既可以把有符号的byte转换成无符号的byte(用int类型存储),也可以把有符号但可能超出byte范围的数据转换成有符号的byte。
在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[ i ] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。
答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。
java 代码
public static String byteToString(byte b) {
byte high, low;
byte maskHigh = (byte)0xf0;
byte maskLow = 0x0f;
high = (byte)((b & maskHigh) >> 4);
low = (byte)(b & maskLow);
StringBuffer buf = new StringBuffer();
buf.append(findHex(high));
buf.append(findHex(low));
return buf.toString();
}
private static char findHex(byte b) {
int t = new Byte(b).intValue();
t = t < 0 ? t + 16 : t;
if ((0 <= t) &&(t <= 9)) {
return (char)(t + '0');
}
return (char)(t-10+'A');
}
未解决的疑问在java中不存在类似C中的无符号量,所以如果一个字节超过0x80其对应的整型值即为负值,但在高位右移4位后还是负值,且与对应的正值相差16,比如0xB2经过右移后的期望值是0x0B(11)但实际值是-5与预期的值相差16(这个16通过多次试验得出),对此现象为找到合理的解释。
问题2:“String a=”B2” --> byte b=0xB2”字符的byte转换为byte数据类型
答:思路通过Integer作为转换的中间桥梁
java 代码
public static int stringToByte(String in, byte[] b) throws Exception {
if (b.length < in.length() / 2) {
throw new Exception("byte array too small");
}
int j=0;
StringBuffer buf = new StringBuffer(2);
for (int i=0; i
buf.insert(0, in.charAt(i));
buf.insert(1, in.charAt(i+1));
int t = Integer.parseInt(buf.toString(),16);
System.out.println("byte hex value:" + t);
b[j] = (byte)t;
i++;
buf.delete(0,2);
}
return j;
}
问题3:整数(表示范围限定为两个字节unsigned short)通过Integer.byteValue()转换成byte[2],如果超出一个byte的表示范围将会截断高位的值。
答:思路一个byte能表示的最大整数为256(超过128为负值,超过256将被截断),所以取256的倍数为byte[0],256的余数为byte[1]。
java 代码
byte[] d = new byte[l+2];
….
buff.put(new Integer(l/256).byteValue());
buff.put(new Integer(l%256).byteValue());
int unsignedByte = signedByte >=0 ? signedByte : signedByte + 256;
这里我们发现,由于byte的符号位的关系,我们不得不采用长度更长的int类型来处理符号位带来的问题。因此,我们会觉得byte由于要考虑符号位其范围变小了,所以,我们只好通过int来处理。在这个类型的转换过程中,任意长度的int类型会截断其高位的字节来适应byte类型,因为int类型要比byte类型宽。这也就是为什么一个int的127转换成了byte还是一个127。
不过,我们考虑另外一种情况,就是当一个int值大过byte表示的数值范围的时候,这个时候问题就出现了。比如,int的128转换成一个byte类型会是-128。这是因为补码运算的关系造成的。首先,128写成16进制是0x00000080,当做int到byte的类型转换的时候,前面的0被截断形成0x80。在二进制中0x80可以写成10000000,如果这是一个无符号数哪么一切正常,但是如果是一个有符号数就会经过补码运算。对于负数而言,其补码运算就是反码(就是1转换成0并且反正既然)加一。哪么,10000000的补码就是01111111加一,即10000000=128(十进制)。因此,byte0x80事实上表示的也
就是-128了。类似的int类型的129就是byte类型的-127,而int类型的130则是byte类型的-126,等等,直到int的255对应为byte的-1。
哪么如果到了256呢?此时,地位的字节被0来填充,简而言之256就是0x00000100。因此,转换成byte就是0,这个转换循环也就是256个。因此,我们根据上述原理,得出如下规律:
byte byteValue=0;
int temp = intValue % 256;
if ( intValue < 0) {
byteValue = (byte)(temp < -128 ? 256 + temp : temp);
}
else {
byteValue = (byte)(temp > 127 ? temp - 256 : temp);
}
上述过程中,我们既可以把有符号的byte转换成无符号的byte(用int类型存储),也可以把有符号但可能超出byte范围的数据转换成有符号的byte。
在剖析该问题前请看如下代码
public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[ i ] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.
其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式
问题1:java中没有实现这种“byte a = 0xB2 --> String b = “B2””转换的简单实现需要自己实现。
答:自己编写的转换函数,思路将byte的高低4位分开,分别转换为对应的字符然后合成返回的字符串。
java 代码
public static String byteToString(byte b) {
byte high, low;
byte maskHigh = (byte)0xf0;
byte maskLow = 0x0f;
high = (byte)((b & maskHigh) >> 4);
low = (byte)(b & maskLow);
StringBuffer buf = new StringBuffer();
buf.append(findHex(high));
buf.append(findHex(low));
return buf.toString();
}
private static char findHex(byte b) {
int t = new Byte(b).intValue();
t = t < 0 ? t + 16 : t;
if ((0 <= t) &&(t <= 9)) {
return (char)(t + '0');
}
return (char)(t-10+'A');
}
未解决的疑问在java中不存在类似C中的无符号量,所以如果一个字节超过0x80其对应的整型值即为负值,但在高位右移4位后还是负值,且与对应的正值相差16,比如0xB2经过右移后的期望值是0x0B(11)但实际值是-5与预期的值相差16(这个16通过多次试验得出),对此现象为找到合理的解释。
问题2:“String a=”B2” --> byte b=0xB2”字符的byte转换为byte数据类型
答:思路通过Integer作为转换的中间桥梁
java 代码
public static int stringToByte(String in, byte[] b) throws Exception {
if (b.length < in.length() / 2) {
throw new Exception("byte array too small");
}
int j=0;
StringBuffer buf = new StringBuffer(2);
for (int i=0; i
buf.insert(0, in.charAt(i));
buf.insert(1, in.charAt(i+1));
int t = Integer.parseInt(buf.toString(),16);
System.out.println("byte hex value:" + t);
b[j] = (byte)t;
i++;
buf.delete(0,2);
}
return j;
}
问题3:整数(表示范围限定为两个字节unsigned short)通过Integer.byteValue()转换成byte[2],如果超出一个byte的表示范围将会截断高位的值。
答:思路一个byte能表示的最大整数为256(超过128为负值,超过256将被截断),所以取256的倍数为byte[0],256的余数为byte[1]。
java 代码
byte[] d = new byte[l+2];
….
buff.put(new Integer(l/256).byteValue());
buff.put(new Integer(l%256).byteValue());
发表评论
-
Java Classloader机制解析
2015-07-14 14:14 859做Java开发,对于ClassLoader的机制是必须要熟悉 ... -
JVM Internals
2014-12-05 11:04 799This article explains the ... -
JVM必备指南
2014-11-01 11:20 492本文由 ImportNew - xiafei 翻译自 ant ... -
open jdk源码下载地址
2014-10-13 23:19 1149OpenJDK 和Oracle JDK 共用了大量相同的代码 ... -
Java中System.loadLibrary() 的执行过程
2014-10-10 11:45 6193转自:http://my.oschina.net/wolfc ... -
java 垃圾回收总结
2014-10-03 22:47 725转自:http://www.cnblogs.com/aigo ... -
java中volatile关键字的含义
2014-10-03 22:39 651转自:http://www.cnblogs.com/aigo ... -
java并发编程-Executor框架
2014-10-01 23:40 569Executor框架是指java 5中 ... -
Java中ArrayList和LinkedList区别
2014-09-17 18:48 584转自:http://pengcqu.iteye. ... -
深入理解Java内存模型之系列篇
2014-09-16 11:16 880转自:http://blog.csdn.net/ ... -
Java Thread 总结
2014-09-15 22:39 605转自:http://www.cnblogs.com/Drea ... -
如何停止一个正在运行的java线程
2014-09-15 22:33 1995转自:http://ibruce.info/2013/12 ... -
详解sleep和wait的区别
2014-09-15 22:16 2479转自:http://www.cnblogs.com/Dre ... -
Java多线程总结之由synchronized说开去
2014-09-14 13:11 673转自: http://hellosure.iteye.co ... -
ThreadLocal的正确用法
2014-09-13 23:52 512用法一:在关联数据类中创建private static ... -
Hashtable与ConcurrentHashMap差别
2014-09-06 00:00 927Hashtable与ConcurrentHashMap区别 ... -
JAVA多线程和并发基础面试问答
2014-09-01 22:56 689多线程和并发问题是Jav ... -
java 双重加锁及单例模式
2014-08-25 18:02 1168单例创建模式是一个通用的编程习语。和多线程一起使用时,必需使 ... -
Java内部类的使用小结
2014-08-13 21:45 578内部类是指在一个外部类的内部再定义一个类。类名不需要和文件夹 ... -
java sleep和wait的区别和联系
2014-08-10 20:46 674第一种解释: 功 ...
相关推荐
在Java中,基本数据类型byte与int之间的相互转换涉及到计算机的二进制运算、位移操作以及补码的概念。我们首先了解Java中int和byte的数据结构,然后探讨它们之间的转换方法及其背后的原理。 **基本数据类型结构:**...
ip地址转4字节byte,char转2字节byte,byte数组转char,int整数转换为4字节的byte数组,byte数组转换为int整数,double类型转8字节数组,8位数组转double,long整数转换为8字节的byte数组,short整数转换为2字节的...
在Java编程中,将`int`类型转换为`byte`数组以及从`byte`数组还原回`int`类型是常见的操作,特别是在网络编程中。这是因为网络传输的数据通常以字节流的形式存在,而`int`等基本数据类型需要进行适当的序列化才能...
首先,Integer在Java中占用4个字节(32位),其中最高位作为符号位。如果最高位是1,表示这是一个负数;如果是0,则表示正数。在进行位运算时,Java会将byte类型自动扩展为int类型进行操作,这是因为byte的范围较小...
在32位的单精度浮点数中,浮点数分为三个部分:符号位(1位)、指数部分(8位)和尾数部分(23位)。具体分布如下: 1. 符号位:决定浮点数是正还是负,0表示正,1表示负。 2. 指数位:存储指数值,但这个值是偏移...
- 由于Java中的int是带符号的,所以在转换过程中要注意避免溢出问题。例如,如果输入的int值为负数,转换后的byte数组可能无法正确还原int值,因为负数的二进制表示中最高位是1。 在处理这类转换时,了解二进制和位...
但是,在实际操作中,我们需要考虑到Java中int类型数据是有符号的,最高位为符号位,为0的话表示正数,为1的话表示负数。 为了将byte数组转换为int数组,我们需要使用移位操作和或运算。首先,我们需要将四个byte按...
// &0xff将byte值无差异转成int,避免Java自动类型提升后,会保留高位的符号位 int v1 = (a[1] & 0xff) ; int v2 = (a[2] & 0xff) ; int v3 = (a[3] & 0xff); return v0 + v1 + v2 + v3; } ``` 该方法首先从`byte...
### Java中的char与byte的区别详解 #### 一、引言 在Java编程语言中,`char` 和 `byte` 是两种基本的数据类型,它们分别用于处理字符和数值数据。尽管这两种类型都用来存储数据,但它们之间存在着显著的差异。本文...
Java中的`byte`是8位(1字节)的有符号整数,范围为-128到127,而`int`是32位(4字节)的有符号整数,范围更广泛。转换方法如下: - **int转byte**:由于`int`的范围包含`byte`的范围,可以直接通过类型转换`(byte...
在Java编程语言中,编码和转换是至关重要的概念,特别是在处理字符集和处理不同编码格式的数据时。乱码问题通常是由于编码不一致或不当转换导致的。以下将详细阐述Java中涉及编码转换的关键知识点。 一、概念 1. ...
这个方法通过与0xFF进行按位与操作,确保了结果的最高位不会被解释为符号位,而是作为无符号扩展的一部分。 其次,`byte`到`String`的十六进制表示也是常见的需求。`byteToHex`方法实现了这个功能,它将`byte`转换...
首先,我们需要理解Java中的字节数组(`byte[]`)和16进制字符串之间的关系。一个字节在Java中占用8位,可以表示-128到127之间的整数。而16进制的一个字符则表示4位(半字节),因此,一个字节可以用两个16进制字符...
浮点数在计算机内部通常是用二进制的格式存储的,具体分为两部分:符号位、指数部分和尾数部分。在Java中,浮点数有两种主要形式:单精度浮点数(float)和双精度浮点数(double),它们分别使用32位和64位来存储。 ...
总结,Java中的`int`到`byte[]`和`byte[]`到`int`的转换涉及位运算,包括位移和按位与。理解这些基本的位运算对于处理二进制数据至关重要。在实际开发中,确保数据类型的正确转换是保证程序正常运行的关键步骤。
在C#中,`byte`类型是一个无符号8位整数,其取值范围是0到255。而`int`则是一个有符号32位整数,范围为-2^31到2^31-1。由于`byte`是无符号的,它无法直接表示负数,因此在处理温度等可能为负的数值时,我们需要通过...
- **按位或(|)**:如果两个相应位中有任意一位为1,则结果位为1;否则为0。 - **按位异或(^)**:如果两个相应位不同,则结果位为1;否则为0。 - **按位取反(~)**:将每个位取反,即0变1,1变0。 - **左移位...
在Java中,byte是基本数据类型之一,表示8位无符号整数。我们可以使用byte数组来表示一个文件的内容,然后将其写入到文件中。 知识点1: String 转为Byte输出("UTF-8"格式) 在Java中,我们可以使用String类的...
而从`byte[]`转换回`char`,可以直接将两个字节视为无符号的16位整数。 9. **`Object`和`String`转换**: - 对于对象,通常使用序列化(`java.io.Serializable`)接口将对象转换为字节数组,然后反序列化回来。对于`...
由于ASCII码是7位,可以使用`(char)(byteValue & 0x7F)`来获取ASCII值,并将其转换为字符。 4. **写入文本文件**:使用`FileOutputStream`和`PrintStream`创建一个文本输出流,将ASCII字符写入文本文件。 5. **关闭...