java byte to binary_java byte 与 binary 转换

在写通讯程序时,有时需要解析二进制数据流,可能会遇到java数值类型与二进制byte数组的类型转换问题。因此,笔者提供下面代码实例,供大家需要时参考。

import java.io.*;

/**

* java数值类型与二进制类型相互转换

* @author lijun

*

*/

public class MyTest {

/**

* int32转换为二进制(4个字节)

* @param i 待转换的整数

* @return 返回4字节二进制数

*/

public byte[] int2byte(int i){

byte[] res = new byte[4];

res[3] = (byte)i;

res[2] = (byte)(i>>>8);

res[1] = (byte)(i>>>16);

res[0] = (byte)(i>>>24);

return res;

}

/**

* 4字节二进制数转换为int32的整数

* @param bytes 4字节的二进制数

* @return int32整数

*/

public int byte2int(byte[] bytes){

int res = (((bytes[0]<<24)>>>24)<<24)|(((bytes[1]<<24)>>>24)<<16)|(((bytes[2]<<24)>>>24)<<8)|((bytes[3]<<24)>>>24);

return res;

}

/**

* int16整数转换二2字节的二进制数

* @param i int16整数

* @return 2字节的二进制数

*/

public byte[] int16Tobyte(int i){

byte[] res = new byte[2];

res[1] = (byte)i;

res[0] = (byte)(i>>>8);

return res;

}

/**

* 2字节的二进制数转换为int16整数

* @param bytes 2字节的二进制数

* @return int16整数

*/

public int byteToint16(byte[] bytes){

int res = ((bytes[0]<<8)|((bytes[1]<<24)>>>24));

return res;

}

/**

* 长整型long转换为8字节的二进制数

* @param l 长整型long

* @return 8字节的二进制数

*/

public byte[] long2byte(long l){

byte[] res = new byte[8];

res[7] = (byte)l;

res[6] = (byte)(l>>>8);

res[5] = (byte)(l>>>16);

res[4] = (byte)(l>>>24);

res[3] = (byte)(l>>>32);

res[2] = (byte)(l>>>40);

res[1] = (byte)(l>>>48);

res[0] = (byte)(l>>>56);

return res;

}

/**

* 8字节的二进制数转换为长整型long

* @param bytes 8字节的二进制数

* @return 长整型long

*/

public long byte2long(byte[] bytes){

long l0 = bytes[0];

long l1 = bytes[1];

long l2 = bytes[2];

long l3 = bytes[3];

long l4 = bytes[4];

long l5 = bytes[5];

long l6 = bytes[6];

long l7 = bytes[7];

long res = (l0<<56)|(((l1<<56)>>>56)<<48)|(((l2<<56)>>>56)<<40)|(((l3<<56)>>>56)<<32)|(((l4<<56)>>>56)<<24)|(((l5<<56)>>>56)<<16)|(((l6<<56)>>>56)<<8)|((l7<<56)>>>56);

return res;

}

/**

* 浮点型float转换为4字节的二进制数

* @param f 浮点数float

* @return 4字节的二进制数

*/

public byte[] float2byte(float f){

byte[] res = new byte[4];

int l = Float.floatToIntBits(f);

for(int i=3; i>=0; i--){

res[i] = new Integer(l).byteValue();

l >>= 8;

}

return res;

}

/**

* 4字节的二进制数转换为浮点数float

* @param bytes 4字节的二进制数

* @return 浮点数float

*/

public float byte2float(byte[] bytes){

int l = byte2int(bytes);

float res = Float.intBitsToFloat(l);

return res;

}

/**

* 双浮点数转换为8字节的二进制数

* @param d 双浮点数double

* @return 8字节的二进制数

*/

public byte[] double2byte(double d){

long l = Double.doubleToLongBits(d);

byte[] res = long2byte(l);

return res;

}

/**

* 8字节的二进制数转换为双浮点数

* @param bytes 8字节的二进制数

* @return 双浮点数double

*/

public double byte2double(byte[] bytes){

long l = byte2long(bytes);

double res = Double.longBitsToDouble(l);

return res;

}

public void test()throws Exception{

FileOutputStream fos = new FileOutputStream("d:/data.dat");

java.io.DataOutputStream dos = new DataOutputStream(fos);

double d = 233344.233444;

dos.writeDouble(d);

dos.close();

fos.close();

}

public static void main(String[] args)throws Exception{

System.out.println("begin write a int type to file:'c:/data.dat'");

new MyTest().test();

System.out.println("end write..");

}

}

以下为单元测试代码:

import junit.framework.Assert;

import org.junit.Test;

public class MyTestTest {

private MyTest test = new MyTest();

@Test

public void int2byteTest()

{

int i = -10101;

byte[] bytes = test.int2byte(i);

int j = test.byte2int(bytes);

Assert.assertEquals(i, j);

i = 10101;

bytes = test.int2byte(i);

j = test.byte2int(bytes);

Assert.assertEquals(i, j);

i = -0x1f1f1f;

bytes = test.int2byte(i);

j = test.byte2int(bytes);

Assert.assertEquals(i, j);

i = 0x1f1f1f;

bytes = test.int2byte(i);

j = test.byte2int(bytes);

Assert.assertEquals(i, j);

i = 0x1f1f1f1f;

bytes = test.int2byte(i);

j = test.byte2int(bytes);

Assert.assertEquals(i, j);

i = -0x1f1f1f1f;

bytes = test.int2byte(i);

j = test.byte2int(bytes);

Assert.assertEquals(i, j);

}

@Test

public void int16TobyteTest(){

int i = -0x01;

byte[] bytes = test.int16Tobyte(i);

int j = test.byteToint16(bytes);

Assert.assertEquals("-0x01",i, j);

i = 0x01;

bytes = test.int16Tobyte(i);

j = test.byteToint16(bytes);

Assert.assertEquals("0x01",i, j);

i = -0x0101;

bytes = test.int16Tobyte(i);

j = test.byteToint16(bytes);

Assert.assertEquals("-0x0101",i, j);

i = 0x0101;

bytes = test.int16Tobyte(i);

j = test.byteToint16(bytes);

Assert.assertEquals("0x0101",i, j);

}

@Test

public void long2byteTest(){

long l = -0x01;

byte[] bytes = test.long2byte(l);

long j = test.byte2long(bytes);

Assert.assertEquals("-0x01",l, j);

l = 0x01;

bytes = test.long2byte(l);

j = test.byte2long(bytes);

Assert.assertEquals("0x01",l, j);

l = -0x0101;

bytes = test.long2byte(l);

j = test.byte2long(bytes);

Assert.assertEquals("-0x0101",l, j);

l = -0x0101;

bytes = test.long2byte(l);

j = test.byte2long(bytes);

Assert.assertEquals("-0x0101",l, j);

}

@Test

public void float2byteTest()

{

float f = 233344.233444f;

byte[] bytes = test.float2byte(f);

float j = test.byte2float(bytes);

Assert.assertEquals(f, j);

}

@Test

public void double2byteTest(){

double d = 233344.233444;

byte[] bytes = test.double2byte(d);

double j = test.byte2double(bytes);

Assert.assertEquals(d, j);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值