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程序设计有所帮助。