热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java类型转换(int-byte[],float-byte[])

有符号字节转成无符号字节javaint转成byteintunsignedBytesignedByte>0?signedByte:256+signe

有符号字节转成无符号字节 java int 转成 byte

        int unsignedByte = signedByte >= 0 ? signedByte :256 + signedByte;
int byteValue;
int temp = intValue % 256;
if ( intValue <0) {
byteValue = temp <-128 ?256 + temp : temp;
}
else {
byteValue = temp > 127 ? temp -256 : temp;
}
 

float -> byte[]

先用 Float.floatToIntBits(f)转换成int
再通过如下方法转成byte []

 

int -> byte[]

/**
* 将int类型的数据转换为byte数组
* 原理:将int数据中的四个byte取出,分别存储
* @param n int数据
* @return 生成的byte数组
*/
public static byte[] intToBytes2(int n){
byte[] b = new byte[4];
for(int i = 0;i <4;i++){
b[i] = (byte)(n >> (24 - i * 8));
}
return b;
}

byte[] -> int
/**
* 将byte数组转换为int数据
* @param b 字节数组
* @return 生成的int数据
*/
public static int byteToInt2(byte[] b){
return (((int)b[0]) <<24) + (((int)b[1]) <<16) + (((int)b[2]) <<8) + b[3];
}
}

byte[] -> float

    public static float getFloat(byte[] b) {
// 4 bytes
int accum = 0;
for ( int shiftBy = 0; shiftBy <4; shiftBy++ ) {
accum |= (b[shiftBy] & 0xff) < }
return Float.intBitsToFloat(accum);
}

 java的int、char、long、float、double对byte的转换

老物,,在通信的时候会用到

http://xuliduo.iteye.com/blog/1126957

 

1.package com.util;  
2.
3./**
4. *
5. *

    6. *
  • 文件名称: com.born.util.ByteUtil.java

  • 7. *
  • 文件描述: byte转换工具

  • 8. *
  • 版权所有: 版权所有(C)2001-2006

  • 9. *
  • 公 司: bran

  • 10. *
  • 内容摘要:

  • 11. *
  • 其他说明:

  • 12. *
  • 完成日期:2011-7-18

  • 13. *
  • 修改记录0:无

  • 14. *

15. *
16. * @version 1.0
17. * @author 许力多
18. */
19.public class ByteUtil {
20. /**
21. * 转换short为byte
22. *
23. * @param b
24. * @param s
25. * 需要转换的short
26. * @param index
27.
28. */
29. public static void putShort(byte b[], short s, int index) {
30. b[index + 1] = (byte) (s >> 8);
31. b[index + 0] = (byte) (s >> 0);
32. }
33.
34. /**
35. * 通过byte数组取到short
36. *
37. * @param b
38. * @param index
39. * 第几位开始取
40. * @return
41. */
42. public static short getShort(byte[] b, int index) {
43. return (short) (((b[index + 1] <<8) | b[index + 0] & 0xff));
44. }
45.
46. /**
47. * 转换int为byte数组
48. *
49. * @param bb
50. * @param x
51. * @param index
52. */
53. public static void putInt(byte[] bb, int x, int index) {
54. bb[index + 3] = (byte) (x >> 24);
55. bb[index + 2] = (byte) (x >> 16);
56. bb[index + 1] = (byte) (x >> 8);
57. bb[index + 0] = (byte) (x >> 0);
58. }
59.
60. /**
61. * 通过byte数组取到int
62. *
63. * @param bb
64. * @param index
65. * 第几位开始
66. * @return
67. */
68. public static int getInt(byte[] bb, int index) {
69. return (int) ((((bb[index + 3] & 0xff) <<24)
70. | ((bb[index + 2] & 0xff) <<16)
71. | ((bb[index + 1] & 0xff) <<8) | ((bb[index + 0] & 0xff) <<0)));
72. }
73.
74. /**
75. * 转换long型为byte数组
76. *
77. * @param bb
78. * @param x
79. * @param index
80. */
81. public static void putLong(byte[] bb, long x, int index) {
82. bb[index + 7] = (byte) (x >> 56);
83. bb[index + 6] = (byte) (x >> 48);
84. bb[index + 5] = (byte) (x >> 40);
85. bb[index + 4] = (byte) (x >> 32);
86. bb[index + 3] = (byte) (x >> 24);
87. bb[index + 2] = (byte) (x >> 16);
88. bb[index + 1] = (byte) (x >> 8);
89. bb[index + 0] = (byte) (x >> 0);
90. }
91.
92. /**
93. * 通过byte数组取到long
94. *
95. * @param bb
96. * @param index
97. * @return
98. */
99. public static long getLong(byte[] bb, int index) {
100. return ((((long) bb[index + 7] & 0xff) <<56)
101. | (((long) bb[index + 6] & 0xff) <<48)
102. | (((long) bb[index + 5] & 0xff) <<40)
103. | (((long) bb[index + 4] & 0xff) <<32)
104. | (((long) bb[index + 3] & 0xff) <<24)
105. | (((long) bb[index + 2] & 0xff) <<16)
106. | (((long) bb[index + 1] & 0xff) <<8) | (((long) bb[index + 0] & 0xff) <<0));
107. }
108.
109. /**
110. * 字符到字节转换
111. *
112. * @param ch
113. * @return
114. */
115. public static void putChar(byte[] bb, char ch, int index) {
116. int temp = (int) ch;
117. // byte[] b = new byte[2];
118. for (int i = 0; i <2; i ++ ) {
119. bb[index + i] = new Integer(temp & 0xff).byteValue(); // 将最高位保存在最低位
120. temp = temp >> 8; // 向右移8位
121. }
122. }
123.
124. /**
125. * 字节到字符转换
126. *
127. * @param b
128. * @return
129. */
130. public static char getChar(byte[] b, int index) {
131. int s = 0;
132. if (b[index + 1] > 0)
133. s += b[index + 1];
134. else
135. s += 256 + b[index + 0];
136. s *= 256;
137. if (b[index + 0] > 0)
138. s += b[index + 1];
139. else
140. s += 256 + b[index + 0];
141. char ch = (char) s;
142. return ch;
143. }
144.
145. /**
146. * float转换byte
147. *
148. * @param bb
149. * @param x
150. * @param index
151. */
152. public static void putFloat(byte[] bb, float x, int index) {
153. // byte[] b = new byte[4];
154. int l = Float.floatToIntBits(x);
155. for (int i = 0; i <4; i++) {
156. bb[index + i] = new Integer(l).byteValue();
157. l = l >> 8;
158. }
159. }
160.
161. /**
162. * 通过byte数组取得float
163. *
164. * @param bb
165. * @param index
166. * @return
167. */
168. public static float getFloat(byte[] b, int index) {
169. int l;
170. l = b[index + 0];
171. l &= 0xff;
172. l |= ((long) b[index + 1] <<8);
173. l &= 0xffff;
174. l |= ((long) b[index + 2] <<16);
175. l &= 0xffffff;
176. l |= ((long) b[index + 3] <<24);
177. return Float.intBitsToFloat(l);
178. }
179.
180. /**
181. * double转换byte
182. *
183. * @param bb
184. * @param x
185. * @param index
186. */
187. public static void putDouble(byte[] bb, double x, int index) {
188. // byte[] b = new byte[8];
189. long l = Double.doubleToLongBits(x);
190. for (int i = 0; i <4; i++) {
191. bb[index + i] = new Long(l).byteValue();
192. l = l >> 8;
193. }
194. }
195.
196. /**
197. * 通过byte数组取得float
198. *
199. * @param bb
200. * @param index
201. * @return
202. */
203. public static double getDouble(byte[] b, int index) {
204. long l;
205. l = b[0];
206. l &= 0xff;
207. l |= ((long) b[1] <<8);
208. l &= 0xffff;
209. l |= ((long) b[2] <<16);
210. l &= 0xffffff;
211. l |= ((long) b[3] <<24);
212. l &= 0xffffffffl;
213. l |= ((long) b[4] <<32);
214. l &= 0xffffffffffl;
215. l |= ((long) b[5] <<40);
216. l &= 0xffffffffffffl;
217. l |= ((long) b[6] <<48);
218. l &= 0xffffffffffffffl;
219. l |= ((long) b[7] <<56);
220. return Double.longBitsToDouble(l);
221. }
222.}


 

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。

方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取。

        Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法:
         (1)int   readUnsignedByte()    //从流中读取一个0~255(0xFF)的单字节数据,并以int数据类型的数据返回。返回的数据相当于C/C++语言中所谓的“BYTE”。
          (2)int readUnsignedShort()   //从流中读取一个0~65535(0xFFFF)的双字节数据,并以int数据类型的数据返回。返回的数据相当于C/C++语言中所谓的“WORD”,并且是以“低地址低字节”的方式返回的,所以程序员不需要额外的转换。

方案二:利用Java位运算符,完成Unsigned转换。

       正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码:

      public int getUnsignedByte (byte data){      //将data字节型数据转换为0~255 (0xFF 即BYTE)。
         return data&0x0FF;
      }

      public int getUnsignedByte (short data){      //将data字节型数据转换为0~65535 (0xFFFF 即 WORD)。
            return data&0x0FFFF;
      }      

     public long getUnsignedIntt (int data){     //将int数据转换为0~4294967295 (0xFFFFFFFF即DWORD)。
         return data&0x0FFFFFFFFl;
      }

        灵活的运用这些技法,根本不存“二进制在Java中得不到全面支持”的论断!

 

JAVA中int、String的类型转换

 

int -> String

int i=12345;
String s="";
第一种方法:s=i+"";
第二种方法:s=String.valueOf(i);
这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?

String -> int

s="12345";
int i;
第一种方法:i=Integer.parseInt(s);
第二种方法:i=Integer.valueOf(s).intValue();
这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?

以下是答案:

第一种方法:s=i+""; //会产生两个String对象
第二种方法:s=String.valueOf(i); //直接使用String类的静态方法,只产生一个对象

第一种方法:i=Integer.parseInt(s);//直接使用静态方法,不会产生多余的对象,但会抛出异常
第二种方法:i=Integer.valueOf(s).intValue();//Integer.valueOf(s) 相当于 new Integer(Integer.parseInt(s)),也会抛异常,但会多产生一个对象

--------------------------------------------------------------------1如何将字串 String 转换成整数 int?

A. 有两个方法:

1). int i = Integer.parseInt([String]); 或
i = Integer.parseInt([String],[int radix]);

2). int i = Integer.valueOf(my_str).intValue();

注: 字串转成 Double, Float, Long 的方法大同小异.
2 如何将整数 int 转换成字串 String ?
A. 有叁种方法:

1.) String s = String.valueOf(i);

2.) String s = Integer.toString(i);

3.) String s = "" + i;

注: Double, Float, Long 转成字串的方法大同小异.



JAVA数据类型转换

这是一个例子,说的是JAVA中数据数型的转换.供大家学习

package shenmixiaozhu;
import java.sql.Date;
public class TypeChange {
public TypeChange() {
}
//change the string type to the int type
public static int stringToInt(String intstr)
{
Integer integer;
integer = Integer.valueOf(intstr);
return integer.intValue();
}
//change int type to the string type
public static String intToString(int value)
{
Integer integer = new Integer(value);
return integer.toString();
}
//change the string type to the float type
public static float stringToFloat(String floatstr)
{
Float floatee;
floatee = Float.valueOf(floatstr);
return floatee.floatValue();
}
//change the float type to the string type
public static String floatToString(float value)
{
Float floatee = new Float(value);
return floatee.toString();
}
//change the string type to the sqlDate type
public static java.sql.Date stringToDate(String dateStr)
{
return java.sql.Date.valueOf(dateStr);
}
//change the sqlDate type to the string type
public static String dateToString(java.sql.Date datee)
{
return datee.toString();
}

public static void main(String[] args)
{
java.sql.Date day ;
day = TypeChange.stringToDate("2003-11-3");
String strday = TypeChange.dateToString(day);
System.out.println(strday);
}
}
JAVA中常用数据类型转换函数
虽然都能在JAVA API中找到,整理一下做个备份。

 

 

java中byte转换int时为何与0xff进行与运算

http://blog.csdn.net/xiaojianpitt/article/details/2728756

在剖析该问题前请看如下代码

例一:

/**
* 从byte数组开始位置取4位得到一个int
* @paramababyte数组
* @return返回int值
*/
public staticint getIntFromByte(byte[] ba)
{
int sum = 0;
for (int i = 0; i <4; i++)
{
int temp = ((int) ba[i]) & 0xff;
temp <<= i * 8;
sum = temp + sum;
}

return sum;
}

public static String bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; 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,java的二进制采用的是补码形式。


二进制原码表示法

原码表示法是机器数的一种简单的表示法。其符号位用0表示正号,用:表示负号,数值一般用二进制形式表示。设有一数为x,则原码表示可记作[x]原。

例如,X1= +1010110

X2= -1001010

其原码记作:


[X1]原=[+1010110]原=01010110

[X2]原=[-1001010]原=11001010

byte是一个字节保存的,有8个位,8位的第一个位是符号位,也就是说0000 0001代表的是数1 ,1000 0001代表的就是-1 所以正数最大位0111 1111,也就是数字127 负数最大为1111 1111,也就是数字-127
在原码表示法中,对0有两种表示形式:

[+0]原=00000000

[-0] 原=10000000

 

二进制补码表示法

java中采用的是补码的形式,下面介绍下什么是补码和反码;
1、反码:
        一个数如果是正,则它的反码与原码相同;
        一个数如果是负,则符号位为1,其余各位是对原码取反;

机器数的反码可由原码得到。如果机器数是正数,则该机器数的反码与原码一样;如果机器数是负数,则该机器数的反码是对它的原码(符号位除外)各位取反而得到的。设有一数X,则X的反码表示记作[X]反。

例如:X1= +1010110

X2= 一
1001010

[X1]原
=01010110

[X1]反=[X1]原
=01010110

[X2]原
=11001010

[X2]反=10110101


2、补码:

机器数的补码可由原码得到。如果机器数是正数,则该机器数的补码与原码一样;如果机器数是负数,则该机器数的补码是对它的原码(除符号位外)各位取反,并在未位加1而得到的。设有一数X,则X的补码表示记作[X]补。


    ⑴一个数为正,则它的原码、反码、补码相同
    ⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1
 - 1的原码为
                10000001
- 1的反码为
                11111110
                                                   + 1
- 1的补码为
                11111111

0的原码为
                 00000000
0的反码为                 11111111(正零和负零的反码相同)

                                          +1
0
的补码为               100000000(舍掉打头的1,正零和负零的补码相同)

利用溢出,我们可以将减法变成加法
    

 对于十进制数,从9得到5可用减法:
    9-4=5  因为4+6=10,我们可以将6作为4的补数
    改写为加法:
    9+(10-4)= 9+6=15(去掉高位1,也就是减10)得到5.

对于十六进制数,从c到5可用减法:
    c-7=5    因为7+9=16 将9作为7的补数
    改写为加法:
    c+(16-7)=c+9=15(去掉高位1,也就是减16)得到5.
 在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。


Integer.toHexString的参数是int,如果不进行0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位,这时会进行填充,如果byte的最高位是0的话,int的前面填充0,例如01000001 转化成int就变为00000000000000000000000001000001
如果byte的最高位是1的话,int的前面填充1例如11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。和0xff相与后,高24比特就会被清0了,结果就对了。

推荐阅读
  • [线段树|平衡树|树状数组]LightOJ - 1087 - Diablo
    1087-DiabloPDF(English)StatisticsForum ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
author-avatar
阡蓝fliona
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有