zoukankan      html  css  js  c++  java
  • java整型数与网络字节序的 byte[] 数组转换关系

    学习笔记,转自百度文库。

    工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型。如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整。而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致。
        本文就是针对这种情况,整理了java数据类型和网络字节流或字节包(相当于java的byte数组)之间转换方法。实际上网上这方面的资料不少,但往往不全,甚至有些有错误,于是就花了点时间对java整型数和网络字节序的byte[]之间转换的各种情况做了一些验证和整理。整理出来的函数如下:

      1 public class ByteConvert {
      2     // 以下 是整型数 和 网络字节序的  byte[] 数组之间的转换
      3     public static byte[] longToBytes(long n) {
      4         byte[] b = new byte[8];
      5         b[7] = (byte) (n & 0xff);
      6         b[6] = (byte) (n >> 8  & 0xff);
      7         b[5] = (byte) (n >> 16 & 0xff);
      8         b[4] = (byte) (n >> 24 & 0xff);
      9         b[3] = (byte) (n >> 32 & 0xff);
     10         b[2] = (byte) (n >> 40 & 0xff);
     11         b[1] = (byte) (n >> 48 & 0xff);
     12         b[0] = (byte) (n >> 56 & 0xff);
     13         return b;
     14     }
     15     
     16     public static void longToBytes( long n, byte[] array, int offset ){
     17         array[7+offset] = (byte) (n & 0xff);
     18         array[6+offset] = (byte) (n >> 8 & 0xff);
     19         array[5+offset] = (byte) (n >> 16 & 0xff);
     20         array[4+offset] = (byte) (n >> 24 & 0xff);
     21         array[3+offset] = (byte) (n >> 32 & 0xff);
     22         array[2+offset] = (byte) (n >> 40 & 0xff);
     23         array[1+offset] = (byte) (n >> 48 & 0xff);
     24         array[0+offset] = (byte) (n >> 56 & 0xff);
     25     }
     26     
     27     public static long bytesToLong( byte[] array )
     28     {
     29         return ((((long) array[ 0] & 0xff) << 56)
     30               | (((long) array[ 1] & 0xff) << 48)
     31               | (((long) array[ 2] & 0xff) << 40)
     32               | (((long) array[ 3] & 0xff) << 32)
     33               | (((long) array[ 4] & 0xff) << 24)
     34               | (((long) array[ 5] & 0xff) << 16)
     35               | (((long) array[ 6] & 0xff) << 8) 
     36               | (((long) array[ 7] & 0xff) << 0));        
     37     }
     38     
     39     public static long bytesToLong( byte[] array, int offset )
     40     {
     41         return ((((long) array[offset + 0] & 0xff) << 56)
     42               | (((long) array[offset + 1] & 0xff) << 48)
     43               | (((long) array[offset + 2] & 0xff) << 40)
     44               | (((long) array[offset + 3] & 0xff) << 32)
     45               | (((long) array[offset + 4] & 0xff) << 24)
     46               | (((long) array[offset + 5] & 0xff) << 16)
     47               | (((long) array[offset + 6] & 0xff) << 8) 
     48               | (((long) array[offset + 7] & 0xff) << 0));            
     49     }
     50     
     51     public static byte[] intToBytes(int n) {
     52         byte[] b = new byte[4];
     53         b[3] = (byte) (n & 0xff);
     54         b[2] = (byte) (n >> 8 & 0xff);
     55         b[1] = (byte) (n >> 16 & 0xff);
     56         b[0] = (byte) (n >> 24 & 0xff);
     57         return b;
     58     }
     59     
     60     public static void intToBytes( int n, byte[] array, int offset ){
     61         array[3+offset] = (byte) (n & 0xff);
     62         array[2+offset] = (byte) (n >> 8 & 0xff);
     63         array[1+offset] = (byte) (n >> 16 & 0xff);
     64         array[offset] = (byte) (n >> 24 & 0xff);
     65     }    
     66 
     67     public static int bytesToInt(byte b[]) {
     68         return    b[3] & 0xff 
     69                | (b[2] & 0xff) << 8 
     70                | (b[1] & 0xff) << 16
     71                | (b[0] & 0xff) << 24;
     72     }
     73 
     74     public static int bytesToInt(byte b[], int offset) {
     75         return    b[offset+3] & 0xff 
     76                | (b[offset+2] & 0xff) << 8 
     77                | (b[offset+1] & 0xff) << 16
     78                | (b[offset] & 0xff) << 24;
     79     }
     80 
     81     public static byte[] uintToBytes( long n )
     82     {
     83         byte[] b = new byte[4];
     84         b[3] = (byte) (n & 0xff);
     85         b[2] = (byte) (n >> 8 & 0xff);
     86         b[1] = (byte) (n >> 16 & 0xff);
     87         b[0] = (byte) (n >> 24 & 0xff);
     88         
     89         return b;
     90     }
     91 
     92     public static void uintToBytes( long n, byte[] array, int offset ){
     93         array[3+offset] = (byte) (n );
     94         array[2+offset] = (byte) (n >> 8 & 0xff);
     95         array[1+offset] = (byte) (n >> 16 & 0xff);
     96         array[offset]   = (byte) (n >> 24 & 0xff);
     97     }
     98 
     99     public static long bytesToUint(byte[] array) {  
    100         return ((long) (array[3] & 0xff))  
    101              | ((long) (array[2] & 0xff)) << 8  
    102              | ((long) (array[1] & 0xff)) << 16  
    103              | ((long) (array[0] & 0xff)) << 24;  
    104     }
    105 
    106     public static long bytesToUint(byte[] array, int offset) {   
    107         return ((long) (array[offset+3] & 0xff))  
    108               | ((long) (array[offset+2] & 0xff)) << 8  
    109              | ((long) (array[offset+1] & 0xff)) << 16  
    110              | ((long) (array[offset]   & 0xff)) << 24;  
    111     }
    112 
    113     public static byte[] shortToBytes(short n) {
    114         byte[] b = new byte[2];
    115         b[1] = (byte) ( n       & 0xff);
    116         b[0] = (byte) ((n >> 8) & 0xff);
    117         return b;
    118     }
    119     
    120     public static void shortToBytes(short n, byte[] array, int offset ) {        
    121         array[offset+1] = (byte) ( n       & 0xff);
    122         array[offset] = (byte) ((n >> 8) & 0xff);
    123     }
    124     
    125     public static short bytesToShort(byte[] b){
    126         return (short)( b[1] & 0xff
    127                       |(b[0] & 0xff) << 8 ); 
    128     }    
    129 
    130     public static short bytesToShort(byte[] b, int offset){
    131         return (short)( b[offset+1] & 0xff
    132                       |(b[offset]    & 0xff) << 8 ); 
    133     }
    134 
    135     public static byte[] ushortToBytes(int n) {
    136         byte[] b = new byte[2];
    137         b[1] = (byte) ( n       & 0xff);
    138         b[0] = (byte) ((n >> 8) & 0xff);
    139         return b;
    140     }    
    141 
    142     public static void ushortToBytes(int n, byte[] array, int offset ) {
    143         array[offset+1] = (byte) ( n       & 0xff);
    144         array[offset] = (byte)   ((n >> 8) & 0xff);
    145     }
    146 
    147     public static int bytesToUshort(byte b[]) {
    148         return    b[1] & 0xff 
    149                | (b[0] & 0xff) << 8;
    150     }    
    151 
    152     public static int bytesToUshort(byte b[], int offset) {
    153         return    b[offset+1] & 0xff 
    154                | (b[offset]   & 0xff) << 8;
    155     }    
    156 
    157     public static byte[] ubyteToBytes( int n ){
    158         byte[] b = new byte[1];
    159         b[0] = (byte) (n & 0xff);
    160         return b;
    161     }
    162 
    163     public static void ubyteToBytes( int n, byte[] array, int offset ){
    164         array[0] = (byte) (n & 0xff);
    165     }
    166 
    167     public static int bytesToUbyte( byte[] array ){            
    168         return array[0] & 0xff;
    169     }        
    170 
    171     public static int bytesToUbyte( byte[] array, int offset ){            
    172         return array[offset] & 0xff;
    173     }    
    174     // char 类型、 float、double 类型和 byte[] 数组之间的转换关系还需继续研究实现。 
    175 }
    176 
    177 
    178 测试程序如下:
    179 
    180 public class ByteConvertTest {
    181     
    182     public static String byte2Hex(byte[] buf) 
    183     {
    184         StringBuffer strbuf = new StringBuffer();
    185         strbuf.append("{");
    186         for (byte b : buf) 
    187         {
    188             if (b == 0) 
    189             {
    190                 strbuf.append("00");
    191             } 
    192             else if (b == -1) 
    193             {
    194                 strbuf.append("FF");
    195             } 
    196             else 
    197             {
    198                 String str = Integer.toHexString(b).toUpperCase();
    199                 // sb.append(a);
    200                 if (str.length() == 8) 
    201                 {
    202                     str = str.substring(6, 8);
    203                 } 
    204                 else if (str.length() < 2) 
    205                 {
    206                     str = "0" + str;
    207                 }
    208                 strbuf.append(str);
    209             }
    210             strbuf.append(" ");
    211         }
    212         strbuf.append("}");
    213         return strbuf.toString();
    214     }    
    215 
    216     public static byte[] longToBytes(long n) {
    217         byte[] b = new byte[8];
    218         b[7] = (byte) (n & 0xff);
    219         b[6] = (byte) (n >> 8  & 0xff);
    220         b[5] = (byte) (n >> 16 & 0xff);
    221         b[4] = (byte) (n >> 24 & 0xff);
    222         b[3] = (byte) (n >> 32 & 0xff);
    223         b[2] = (byte) (n >> 40 & 0xff);
    224         b[1] = (byte) (n >> 48 & 0xff);
    225         b[0] = (byte) (n >> 56 & 0xff);
    226         return b;
    227     }
    228 
    229     public static long bytesToLong( byte[] array )
    230     {
    231         return ((((long) array[ 0] & 0xff) << 56)
    232               | (((long) array[ 1] & 0xff) << 48)
    233               | (((long) array[ 2] & 0xff) << 40)
    234               | (((long) array[ 3] & 0xff) << 32)
    235               | (((long) array[ 4] & 0xff) << 24)
    236               | (((long) array[ 5] & 0xff) << 16)
    237               | (((long) array[ 6] & 0xff) << 8) 
    238               | (((long) array[ 7] & 0xff) ));        
    239     }
    240     
    241     public static int bytesToInt(byte b[]) {
    242         return    b[3] & 0xff 
    243                | (b[2] & 0xff) << 8 
    244                | (b[1] & 0xff) << 16
    245                | (b[0] & 0xff) << 24;
    246     }
    247 
    248     public static long bytesToUint(byte[] array) {  
    249         return ((long) (array[3] & 0xff))  
    250              | ((long) (array[2] & 0xff)) << 8  
    251              | ((long) (array[1] & 0xff)) << 16  
    252              | ((long) (array[0] & 0xff)) << 24;  
    253     }
    254 
    255     public static byte[] uintToBytes( long n )
    256     {
    257         byte[] b = new byte[4];
    258         b[3] = (byte) (n & 0xff);
    259         b[2] = (byte) (n >> 8 & 0xff);
    260         b[1] = (byte) (n >> 16 & 0xff);
    261         b[0] = (byte) (n >> 24 & 0xff);
    262         
    263         return b;
    264     }
    265     
    266 
    267     public static byte[] shortToBytes(short n) {
    268         byte[] b = new byte[2];
    269         b[1] = (byte) ( n       & 0xff);
    270         b[0] = (byte) ((n >> 8) & 0xff);
    271         return b;
    272     }
    273     
    274     public static short bytesToShort(byte[] b){
    275         return (short)( b[1] & 0xff
    276                       |(b[0] & 0xff) << 8 ); 
    277     }
    278     
    279     static void testShortConvert(){
    280         System.out.println("=================== short convert =============");
    281         System.out.println("byte2Hex(shortToBytes((short)0x11f2))"+byte2Hex(shortToBytes((short)0x11f2)));        
    282         System.out.print("println 0x11f2:");
    283         System.out.println((short)0x11f2);        
    284         System.out.println("byte2Hex(shortToBytes((short)0xf1f2))"+byte2Hex(shortToBytes((short)0xf1f2)));        
    285         System.out.print("println 0xf1f2:");
    286         System.out.println((short)0xf1f2);            
    287         System.out.print("println bytesToShort(shortToBytes((short)0x11f2)):");
    288         System.out.println((short)bytesToShort(shortToBytes((short)0x11f2)));            
    289         System.out.print("println bytesToShort(shortToBytes((short)0xf1f2)):");
    290         System.out.println((short)bytesToShort(shortToBytes((short)0xf1f2)));        
    291     }
    292     
    293 
    294     public static byte[] ushortToBytes(int n) {
    295         byte[] b = new byte[2];
    296         b[1] = (byte) (n & 0xff);
    297         b[0] = (byte) (n >> 8 & 0xff);
    298         return b;
    299     }
    300     
    301 
    302     public static int bytesToUshort(byte b[]) {
    303         return    b[1] & 0xff 
    304                | (b[0] & 0xff) << 8;
    305     }
    306 
    307     static void testUshortConvert(){
    308         System.out.println("=================== Ushort convert =============");
    309         System.out.println("byte2Hex(ushortToBytes(0x11f2))"+byte2Hex(ushortToBytes(0x11f2)));        
    310         System.out.print("println 0x11f2:");
    311         System.out.println(0x11f2);        
    312         System.out.println("byte2Hex(ushortToBytes(0xf1f2))"+byte2Hex(ushortToBytes(0xf1f2)));        
    313         System.out.print("println 0xf1f2:");
    314         System.out.println(0xf1f2);            
    315         System.out.print("println bytesToUshort(ushortToBytes(0x11f2)):");
    316         System.out.println(bytesToUshort(ushortToBytes(0x11f2)));            
    317         System.out.print("println bytesToUshort(ushortToBytes(0xf1f2)):");
    318         System.out.println(bytesToUshort(ushortToBytes(0xf1f2)));        
    319     }
    320     
    321     public static byte[] ubyteToBytes( int n ){
    322         byte[] b = new byte[1];
    323         b[0] = (byte) (n & 0xff);
    324         return b;
    325     }
    326 
    327     public static int bytesToUbyte( byte[] array ){            
    328         return array[0] & 0xff;
    329     }    
    330 
    331     static void testUbyteConvert(){
    332         System.out.println("=================== Ubyte convert =============");
    333         System.out.println("byte2Hex(ubyteToBytes(0x1112))"+byte2Hex(ubyteToBytes(0x1112)));        
    334         System.out.print("println 0x1112:");
    335         System.out.println(0x1112);        
    336         System.out.println("byte2Hex(ubyteToBytes(0xf2))"+byte2Hex(ubyteToBytes(0xf2)));        
    337         System.out.print("println 0xf2:");
    338         System.out.println(0xf2);            
    339         System.out.print("println bytesToUbyte(ubyteToBytes(0x1112)):");
    340         System.out.println(bytesToUbyte(ubyteToBytes(0x1112)));            
    341         System.out.print("println bytesToUbyte(ubyteToBytes(0xf1f2)):");
    342         System.out.println(bytesToUbyte(ubyteToBytes(0xf1f2)));        
    343     }
    344     
    345     
    346     /**
    347      * @param args
    348      */
    349     public static void main(String[] args) {
    350         // TODO Auto-generated method stub        
    351         byte[] array = new byte[4];
    352         array[3] = (byte) 0xF4;
    353         array[2] = 0x13;
    354         array[1] = 0x12;
    355         array[0] = 0x11;
    356         
    357         System.out.println("=================== Integer bytes =============");
    358         
    359         System.out.println("the bytes is:"+byte2Hex(array) );
    360         System.out.print("println bytesToInt :");
    361         System.out.println( bytesToInt(array));
    362         System.out.printf("printf bytesToInt :%X
    ", bytesToInt(array));
    363         
    364         System.out.println("=================== long bytes =============");
    365         byte[] longBytes = new byte[8];
    366         
    367         longBytes[7] = (byte) 0xf7;
    368         longBytes[6] = (byte) 0x16;
    369         longBytes[5] = (byte) 0xf5;
    370         longBytes[4] = (byte) 0x14;
    371         longBytes[3] = (byte) 0xf3;
    372         longBytes[2] = (byte) 0x12;
    373         longBytes[1] = (byte) 0xf1;
    374         longBytes[0] = (byte) 0x10;
    375         
    376 
    377         System.out.println( "the bytes is:"+byte2Hex(longBytes) );
    378         System.out.printf("printf bytesToLong:%X
    ",bytesToLong(longBytes));
    379         
    380         System.out.println("=================byte to long ================");
    381         
    382         byte b = (byte)0xf1;
    383         System.out.print("Println the byte:");
    384         System.out.println(b);
    385         System.out.printf("Printf the byte:%X
    ",b);
    386         long l = b;
    387         System.out.print("Println byte to long:");
    388         System.out.println(l);
    389         System.out.printf("printf byte to long:%X
    ",l);
    390         
    391         System.out.println("================= uint Bytes ================");
    392         
    393         byte[] uint = new byte[4];
    394         uint[3] = (byte) 0xf3;
    395         uint[2] = (byte) 0x12;
    396         uint[1] = (byte) 0xf1;
    397         uint[0] = (byte) 0xFF;
    398         
    399         System.out.println( "the bytes is:"+byte2Hex(uint) );
    400         System.out.printf("printf bytesToUint:%X
    ",bytesToUint(uint));
    401         System.out.print("Println bytesToUint:");
    402         System.out.println(bytesToUint(uint));
    403         System.out.println("byte2Hex(uintToBytes(0x11f2f3f4f5f6f7f8l)):"+byte2Hex(uintToBytes(0x11f2f3f4f5f6f7f8l)));
    404         
    405         System.out.println("===============Long Integer==============");        
    406         System.out.print("println 0x11f2f3f4f5f6f7f8l:");
    407         System.out.println(0x11f2f3f4f5f6f7f8l);        
    408         System.out.printf("Printf 0x11f2f3f4f5f6f7f8l:%X
    ",0x11f2f3f4f5f6f7f8l);
    409         System.out.println("println byte2Hex(longToBytes(0x11f2f3f4f5f6f7f8l))"+byte2Hex(longToBytes(0x11f2f3f4f5f6f7f8l)));
    410         // 注意,下面的这行,并不能获得正确的uint。
    411         System.out.printf("printf bytesToUint(longToBytes(0x11f2f3f4f5f6f7f8l):%X
    ",bytesToUint(longToBytes(0x11f2f3f4f5f6f7f8l)));
    412         
    413         System.out.println("===============bytesToLong(longToBytes())==============");
    414         System.out.println(bytesToLong(longToBytes(0x11f2f3f4f5f6f7f8l)));
    415         System.out.printf("%X
    ",bytesToLong(longToBytes(0x11f2f3f4f5f6f7f8l)));
    416         
    417         testShortConvert();
    418         testUshortConvert();
    419         testUbyteConvert();
    420     }
    421 
    422 }
  • 相关阅读:
    8.驱动与硬件通信
    11.ok6410之led驱动程序编写
    10.字符设备控制学习
    9.应用程序如何访问驱动
    linux内核打印数据到串口控制台,printk数据不打印问题
    nginx配置-location
    spring-cloud config配置中心
    idea中git stash--解决pull冲突或切换分支问题
    idea中git回退本地仓库版本
    idea中git回退远程仓库版本
  • 原文地址:https://www.cnblogs.com/ning1121/p/3481048.html
Copyright © 2011-2022 走看看