Java整型数与网络字节序byte[]数组转换关系详解
本文实例讲述了Java整型数与网络字节序byte[]数组转换关系。分享给大家供大家参考,具体如下:
工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型。如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整。而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致。
针对这种情况,本文整理了java数据类型和网络字节流或字节包(相当于java的byte数组)之间转换方法。实际上网上这方面的资料不少,但往往不全,甚至有些有错误,于是就花了点时间对java整型数和网络字节序的byte[]之间转换的各种情况做了一些验证和整理。整理出来的函数如下:
publicclassByteConvert{
//以下是整型数和网络字节序的byte[]数组之间的转换
publicstaticbyte[]longToBytes(longn){
byte[]b=newbyte[8];
b[7]=(byte)(n&0xff);
b[6]=(byte)(n>>8&0xff);
b[5]=(byte)(n>>16&0xff);
b[4]=(byte)(n>>24&0xff);
b[3]=(byte)(n>>32&0xff);
b[2]=(byte)(n>>40&0xff);
b[1]=(byte)(n>>48&0xff);
b[0]=(byte)(n>>56&0xff);
returnb;
}
publicstaticvoidlongToBytes(longn,byte[]array,intoffset){
array[7+offset]=(byte)(n&0xff);
array[6+offset]=(byte)(n>>8&0xff);
array[5+offset]=(byte)(n>>16&0xff);
array[4+offset]=(byte)(n>>24&0xff);
array[3+offset]=(byte)(n>>32&0xff);
array[2+offset]=(byte)(n>>40&0xff);
array[1+offset]=(byte)(n>>48&0xff);
array[0+offset]=(byte)(n>>56&0xff);
}
publicstaticlongbytesToLong(byte[]array)
{
return((((long)array[0]&0xff)<<56)
|(((long)array[1]&0xff)<<48)
|(((long)array[2]&0xff)<<40)
|(((long)array[3]&0xff)<<32)
|(((long)array[4]&0xff)<<24)
|(((long)array[5]&0xff)<<16)
|(((long)array[6]&0xff)<<8)
|(((long)array[7]&0xff)<<0));
}
publicstaticlongbytesToLong(byte[]array,intoffset)
{
return((((long)array[offset+0]&0xff)<<56)
|(((long)array[offset+1]&0xff)<<48)
|(((long)array[offset+2]&0xff)<<40)
|(((long)array[offset+3]&0xff)<<32)
|(((long)array[offset+4]&0xff)<<24)
|(((long)array[offset+5]&0xff)<<16)
|(((long)array[offset+6]&0xff)<<8)
|(((long)array[offset+7]&0xff)<<0));
}
publicstaticbyte[]intToBytes(intn){
byte[]b=newbyte[4];
b[3]=(byte)(n&0xff);
b[2]=(byte)(n>>8&0xff);
b[1]=(byte)(n>>16&0xff);
b[0]=(byte)(n>>24&0xff);
returnb;
}
publicstaticvoidintToBytes(intn,byte[]array,intoffset){
array[3+offset]=(byte)(n&0xff);
array[2+offset]=(byte)(n>>8&0xff);
array[1+offset]=(byte)(n>>16&0xff);
array[offset]=(byte)(n>>24&0xff);
}
publicstaticintbytesToInt(byteb[]){
returnb[3]&0xff
|(b[2]&0xff)<<8
|(b[1]&0xff)<<16
|(b[0]&0xff)<<24;
}
publicstaticintbytesToInt(byteb[],intoffset){
returnb[offset+3]&0xff
|(b[offset+2]&0xff)<<8
|(b[offset+1]&0xff)<<16
|(b[offset]&0xff)<<24;
}
publicstaticbyte[]uintToBytes(longn)
{
byte[]b=newbyte[4];
b[3]=(byte)(n&0xff);
b[2]=(byte)(n>>8&0xff);
b[1]=(byte)(n>>16&0xff);
b[0]=(byte)(n>>24&0xff);
returnb;
}
publicstaticvoiduintToBytes(longn,byte[]array,intoffset){
array[3+offset]=(byte)(n);
array[2+offset]=(byte)(n>>8&0xff);
array[1+offset]=(byte)(n>>16&0xff);
array[offset]=(byte)(n>>24&0xff);
}
publicstaticlongbytesToUint(byte[]array){
return((long)(array[3]&0xff))
|((long)(array[2]&0xff))<<8
|((long)(array[1]&0xff))<<16
|((long)(array[0]&0xff))<<24;
}
publicstaticlongbytesToUint(byte[]array,intoffset){
return((long)(array[offset+3]&0xff))
|((long)(array[offset+2]&0xff))<<8
|((long)(array[offset+1]&0xff))<<16
|((long)(array[offset]&0xff))<<24;
}
publicstaticbyte[]shortToBytes(shortn){
byte[]b=newbyte[2];
b[1]=(byte)(n&0xff);
b[0]=(byte)((n>>8)&0xff);
returnb;
}
publicstaticvoidshortToBytes(shortn,byte[]array,intoffset){
array[offset+1]=(byte)(n&0xff);
array[offset]=(byte)((n>>8)&0xff);
}
publicstaticshortbytesToShort(byte[]b){
return(short)(b[1]&0xff
|(b[0]&0xff)<<8);
}
publicstaticshortbytesToShort(byte[]b,intoffset){
return(short)(b[offset+1]&0xff
|(b[offset]&0xff)<<8);
}
publicstaticbyte[]ushortToBytes(intn){
byte[]b=newbyte[2];
b[1]=(byte)(n&0xff);
b[0]=(byte)((n>>8)&0xff);
returnb;
}
publicstaticvoidushortToBytes(intn,byte[]array,intoffset){
array[offset+1]=(byte)(n&0xff);
array[offset]=(byte)((n>>8)&0xff);
}
publicstaticintbytesToUshort(byteb[]){
returnb[1]&0xff
|(b[0]&0xff)<<8;
}
publicstaticintbytesToUshort(byteb[],intoffset){
returnb[offset+1]&0xff
|(b[offset]&0xff)<<8;
}
publicstaticbyte[]ubyteToBytes(intn){
byte[]b=newbyte[1];
b[0]=(byte)(n&0xff);
returnb;
}
publicstaticvoidubyteToBytes(intn,byte[]array,intoffset){
array[0]=(byte)(n&0xff);
}
publicstaticintbytesToUbyte(byte[]array){
returnarray[0]&0xff;
}
publicstaticintbytesToUbyte(byte[]array,intoffset){
returnarray[offset]&0xff;
}
//char类型、float、double类型和byte[]数组之间的转换关系还需继续研究实现。
}
测试程序如下:
publicclassByteConvertTest{
publicstaticStringbyte2Hex(byte[]buf)
{
StringBufferstrbuf=newStringBuffer();
strbuf.append("{");
for(byteb:buf)
{
if(b==0)
{
strbuf.append("00");
}
elseif(b==-1)
{
strbuf.append("FF");
}
else
{
Stringstr=Integer.toHexString(b).toUpperCase();
//sb.append(a);
if(str.length()==8)
{
str=str.substring(6,8);
}
elseif(str.length()<2)
{
str="0"+str;
}
strbuf.append(str);
}
strbuf.append("");
}
strbuf.append("}");
returnstrbuf.toString();
}
publicstaticbyte[]longToBytes(longn){
byte[]b=newbyte[8];
b[7]=(byte)(n&0xff);
b[6]=(byte)(n>>8&0xff);
b[5]=(byte)(n>>16&0xff);
b[4]=(byte)(n>>24&0xff);
b[3]=(byte)(n>>32&0xff);
b[2]=(byte)(n>>40&0xff);
b[1]=(byte)(n>>48&0xff);
b[0]=(byte)(n>>56&0xff);
returnb;
}
publicstaticlongbytesToLong(byte[]array)
{
return((((long)array[0]&0xff)<<56)
|(((long)array[1]&0xff)<<48)
|(((long)array[2]&0xff)<<40)
|(((long)array[3]&0xff)<<32)
|(((long)array[4]&0xff)<<24)
|(((long)array[5]&0xff)<<16)
|(((long)array[6]&0xff)<<8)
|(((long)array[7]&0xff)));
}
publicstaticintbytesToInt(byteb[]){
returnb[3]&0xff
|(b[2]&0xff)<<8
|(b[1]&0xff)<<16
|(b[0]&0xff)<<24;
}
publicstaticlongbytesToUint(byte[]array){
return((long)(array[3]&0xff))
|((long)(array[2]&0xff))<<8
|((long)(array[1]&0xff))<<16
|((long)(array[0]&0xff))<<24;
}
publicstaticbyte[]uintToBytes(longn)
{
byte[]b=newbyte[4];
b[3]=(byte)(n&0xff);
b[2]=(byte)(n>>8&0xff);
b[1]=(byte)(n>>16&0xff);
b[0]=(byte)(n>>24&0xff);
returnb;
}
publicstaticbyte[]shortToBytes(shortn){
byte[]b=newbyte[2];
b[1]=(byte)(n&0xff);
b[0]=(byte)((n>>8)&0xff);
returnb;
}
publicstaticshortbytesToShort(byte[]b){
return(short)(b[1]&0xff
|(b[0]&0xff)<<8);
}
staticvoidtestShortConvert(){
System.out.println("===================shortconvert=============");
System.out.println("byte2Hex(shortToBytes((short)0x11f2))"+byte2Hex(shortToBytes((short)0x11f2)));
System.out.print("println0x11f2:");
System.out.println((short)0x11f2);
System.out.println("byte2Hex(shortToBytes((short)0xf1f2))"+byte2Hex(shortToBytes((short)0xf1f2)));
System.out.print("println0xf1f2:");
System.out.println((short)0xf1f2);
System.out.print("printlnbytesToShort(shortToBytes((short)0x11f2)):");
System.out.println((short)bytesToShort(shortToBytes((short)0x11f2)));
System.out.print("printlnbytesToShort(shortToBytes((short)0xf1f2)):");
System.out.println((short)bytesToShort(shortToBytes((short)0xf1f2)));
}
publicstaticbyte[]ushortToBytes(intn){
byte[]b=newbyte[2];
b[1]=(byte)(n&0xff);
b[0]=(byte)(n>>8&0xff);
returnb;
}
publicstaticintbytesToUshort(byteb[]){
returnb[1]&0xff
|(b[0]&0xff)<<8;
}
staticvoidtestUshortConvert(){
System.out.println("===================Ushortconvert=============");
System.out.println("byte2Hex(ushortToBytes(0x11f2))"+byte2Hex(ushortToBytes(0x11f2)));
System.out.print("println0x11f2:");
System.out.println(0x11f2);
System.out.println("byte2Hex(ushortToBytes(0xf1f2))"+byte2Hex(ushortToBytes(0xf1f2)));
System.out.print("println0xf1f2:");
System.out.println(0xf1f2);
System.out.print("printlnbytesToUshort(ushortToBytes(0x11f2)):");
System.out.println(bytesToUshort(ushortToBytes(0x11f2)));
System.out.print("printlnbytesToUshort(ushortToBytes(0xf1f2)):");
System.out.println(bytesToUshort(ushortToBytes(0xf1f2)));
}
publicstaticbyte[]ubyteToBytes(intn){
byte[]b=newbyte[1];
b[0]=(byte)(n&0xff);
returnb;
}
publicstaticintbytesToUbyte(byte[]array){
returnarray[0]&0xff;
}
staticvoidtestUbyteConvert(){
System.out.println("===================Ubyteconvert=============");
System.out.println("byte2Hex(ubyteToBytes(0x1112))"+byte2Hex(ubyteToBytes(0x1112)));
System.out.print("println0x1112:");
System.out.println(0x1112);
System.out.println("byte2Hex(ubyteToBytes(0xf2))"+byte2Hex(ubyteToBytes(0xf2)));
System.out.print("println0xf2:");
System.out.println(0xf2);
System.out.print("printlnbytesToUbyte(ubyteToBytes(0x1112)):");
System.out.println(bytesToUbyte(ubyteToBytes(0x1112)));
System.out.print("printlnbytesToUbyte(ubyteToBytes(0xf1f2)):");
System.out.println(bytesToUbyte(ubyteToBytes(0xf1f2)));
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
byte[]array=newbyte[4];
array[3]=(byte)0xF4;
array[2]=0x13;
array[1]=0x12;
array[0]=0x11;
System.out.println("===================Integerbytes=============");
System.out.println("thebytesis:"+byte2Hex(array));
System.out.print("printlnbytesToInt:");
System.out.println(bytesToInt(array));
System.out.printf("printfbytesToInt:%X\n",bytesToInt(array));
System.out.println("===================longbytes=============");
byte[]longBytes=newbyte[8];
longBytes[7]=(byte)0xf7;
longBytes[6]=(byte)0x16;
longBytes[5]=(byte)0xf5;
longBytes[4]=(byte)0x14;
longBytes[3]=(byte)0xf3;
longBytes[2]=(byte)0x12;
longBytes[1]=(byte)0xf1;
longBytes[0]=(byte)0x10;
System.out.println("thebytesis:"+byte2Hex(longBytes));
System.out.printf("printfbytesToLong:%X\n",bytesToLong(longBytes));
System.out.println("=================bytetolong================");
byteb=(byte)0xf1;
System.out.print("Printlnthebyte:");
System.out.println(b);
System.out.printf("Printfthebyte:%X\n",b);
longl=b;
System.out.print("Printlnbytetolong:");
System.out.println(l);
System.out.printf("printfbytetolong:%X\n",l);
System.out.println("=================uintBytes================");
byte[]uint=newbyte[4];
uint[3]=(byte)0xf3;
uint[2]=(byte)0x12;
uint[1]=(byte)0xf1;
uint[0]=(byte)0xFF;
System.out.println("thebytesis:"+byte2Hex(uint));
System.out.printf("printfbytesToUint:%X\n",bytesToUint(uint));
System.out.print("PrintlnbytesToUint:");
System.out.println(bytesToUint(uint));
System.out.println("byte2Hex(uintToBytes(0x11f2f3f4f5f6f7f8l)):"+byte2Hex(uintToBytes(0x11f2f3f4f5f6f7f8l)));
System.out.println("===============LongInteger==============");
System.out.print("println0x11f2f3f4f5f6f7f8l:");
System.out.println(0x11f2f3f4f5f6f7f8l);
System.out.printf("Printf0x11f2f3f4f5f6f7f8l:%X\n",0x11f2f3f4f5f6f7f8l);
System.out.println("printlnbyte2Hex(longToBytes(0x11f2f3f4f5f6f7f8l))"+byte2Hex(longToBytes(0x11f2f3f4f5f6f7f8l)));
//注意,下面的这行,并不能获得正确的uint。
System.out.printf("printfbytesToUint(longToBytes(0x11f2f3f4f5f6f7f8l):%X\n",bytesToUint(longToBytes(0x11f2f3f4f5f6f7f8l)));
System.out.println("===============bytesToLong(longToBytes())==============");
System.out.println(bytesToLong(longToBytes(0x11f2f3f4f5f6f7f8l)));
System.out.printf("%X\n",bytesToLong(longToBytes(0x11f2f3f4f5f6f7f8l)));
testShortConvert();
testUshortConvert();
testUbyteConvert();
}
}
更多关于java相关内容感兴趣的读者可查看本站专题:《Java字符与字符串操作技巧总结》、《Java数学运算技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java数组操作技巧总结》
希望本文所述对大家java程序设计有所帮助。