Java整型数与网络字节序byte[]数组转换关系详解

时间:2022-04-28 06:20:40

本文实例讲述了Java整型数与网络字节序byte[]数组转换关系。分享给大家供大家参考,具体如下:

工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型。如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整。而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致。

针对这种情况,本文整理了java数据类型和网络字节流或字节包(相当于java的byte数组)之间转换方法。实际上网上这方面的资料不少,但往往不全,甚至有些有错误,于是就花了点时间对java整型数和网络字节序的byte[]之间转换的各种情况做了一些验证和整理。整理出来的函数如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
public class ByteConvert {
  // 以下 是整型数 和 网络字节序的 byte[] 数组之间的转换
  public static byte[] longToBytes(long n) {
    byte[] b = new byte[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);
    return b;
  }
  public static void longToBytes( long n, byte[] array, int offset ){
    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);
  }
  public static long bytesToLong( 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));
  }
  public static long bytesToLong( byte[] array, int offset )
  {
    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));
  }
  public static byte[] intToBytes(int n) {
    byte[] b = new byte[4];
    b[3] = (byte) (n & 0xff);
    b[2] = (byte) (n >> 8 & 0xff);
    b[1] = (byte) (n >> 16 & 0xff);
    b[0] = (byte) (n >> 24 & 0xff);
    return b;
  }
  public static void intToBytes( int n, byte[] array, int offset ){
    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);
  }
  public static int bytesToInt(byte b[]) {
    return  b[3] & 0xff
        | (b[2] & 0xff) << 8
        | (b[1] & 0xff) << 16
        | (b[0] & 0xff) << 24;
  }
  public static int bytesToInt(byte b[], int offset) {
    return  b[offset+3] & 0xff
        | (b[offset+2] & 0xff) << 8
        | (b[offset+1] & 0xff) << 16
        | (b[offset] & 0xff) << 24;
  }
  public static byte[] uintToBytes( long n )
  {
    byte[] b = new byte[4];
    b[3] = (byte) (n & 0xff);
    b[2] = (byte) (n >> 8 & 0xff);
    b[1] = (byte) (n >> 16 & 0xff);
    b[0] = (byte) (n >> 24 & 0xff);
    return b;
  }
  public static void uintToBytes( long n, byte[] array, int offset ){
    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);
  }
  public static long bytesToUint(byte[] array) {
    return ((long) (array[3] & 0xff))
       | ((long) (array[2] & 0xff)) << 8
       | ((long) (array[1] & 0xff)) << 16
       | ((long) (array[0] & 0xff)) << 24;
  }
  public static long bytesToUint(byte[] array, int offset) {
    return ((long) (array[offset+3] & 0xff))
       | ((long) (array[offset+2] & 0xff)) << 8
       | ((long) (array[offset+1] & 0xff)) << 16
       | ((long) (array[offset]  & 0xff)) << 24;
  }
  public static byte[] shortToBytes(short n) {
    byte[] b = new byte[2];
    b[1] = (byte) ( n    & 0xff);
    b[0] = (byte) ((n >> 8) & 0xff);
    return b;
  }
  public static void shortToBytes(short n, byte[] array, int offset ) {
    array[offset+1] = (byte) ( n    & 0xff);
    array[offset] = (byte) ((n >> 8) & 0xff);
  }
  public static short bytesToShort(byte[] b){
    return (short)( b[1] & 0xff
           |(b[0] & 0xff) << 8 );
  }
  public static short bytesToShort(byte[] b, int offset){
    return (short)( b[offset+1] & 0xff
           |(b[offset]  & 0xff) << 8 );
  }
  public static byte[] ushortToBytes(int n) {
    byte[] b = new byte[2];
    b[1] = (byte) ( n    & 0xff);
    b[0] = (byte) ((n >> 8) & 0xff);
    return b;
  }
  public static void ushortToBytes(int n, byte[] array, int offset ) {
    array[offset+1] = (byte) ( n    & 0xff);
    array[offset] = (byte)  ((n >> 8) & 0xff);
  }
  public static int bytesToUshort(byte b[]) {
    return  b[1] & 0xff
        | (b[0] & 0xff) << 8;
  }
  public static int bytesToUshort(byte b[], int offset) {
    return  b[offset+1] & 0xff
        | (b[offset]  & 0xff) << 8;
  }
  public static byte[] ubyteToBytes( int n ){
    byte[] b = new byte[1];
    b[0] = (byte) (n & 0xff);
    return b;
  }
  public static void ubyteToBytes( int n, byte[] array, int offset ){
    array[0] = (byte) (n & 0xff);
  }
  public static int bytesToUbyte( byte[] array ){
    return array[0] & 0xff;
  }
  public static int bytesToUbyte( byte[] array, int offset ){
    return array[offset] & 0xff;
  }
  // char 类型、 float、double 类型和 byte[] 数组之间的转换关系还需继续研究实现。
}

测试程序如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
public class ByteConvertTest {
  public static String byte2Hex(byte[] buf)
  {
    StringBuffer strbuf = new StringBuffer();
    strbuf.append("{");
    for (byte b : buf)
    {
      if (b == 0)
      {
        strbuf.append("00");
      }
      else if (b == -1)
      {
        strbuf.append("FF");
      }
      else
      {
        String str = Integer.toHexString(b).toUpperCase();
        // sb.append(a);
        if (str.length() == 8)
        {
          str = str.substring(6, 8);
        }
        else if (str.length() < 2)
        {
          str = "0" + str;
        }
        strbuf.append(str);
      }
      strbuf.append(" ");
    }
    strbuf.append("}");
    return strbuf.toString();
  }
  public static byte[] longToBytes(long n) {
    byte[] b = new byte[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);
    return b;
  }
  public static long bytesToLong( 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) ));
  }
  public static int bytesToInt(byte b[]) {
    return  b[3] & 0xff
        | (b[2] & 0xff) << 8
        | (b[1] & 0xff) << 16
        | (b[0] & 0xff) << 24;
  }
  public static long bytesToUint(byte[] array) {
    return ((long) (array[3] & 0xff))
       | ((long) (array[2] & 0xff)) << 8
       | ((long) (array[1] & 0xff)) << 16
       | ((long) (array[0] & 0xff)) << 24;
  }
  public static byte[] uintToBytes( long n )
  {
    byte[] b = new byte[4];
    b[3] = (byte) (n & 0xff);
    b[2] = (byte) (n >> 8 & 0xff);
    b[1] = (byte) (n >> 16 & 0xff);
    b[0] = (byte) (n >> 24 & 0xff);
    return b;
  }
  public static byte[] shortToBytes(short n) {
    byte[] b = new byte[2];
    b[1] = (byte) ( n    & 0xff);
    b[0] = (byte) ((n >> 8) & 0xff);
    return b;
  }
  public static short bytesToShort(byte[] b){
    return (short)( b[1] & 0xff
           |(b[0] & 0xff) << 8 );
  }
  static void testShortConvert(){
    System.out.println("=================== short convert =============");
    System.out.println("byte2Hex(shortToBytes((short)0x11f2))"+byte2Hex(shortToBytes((short)0x11f2)));
    System.out.print("println 0x11f2:");
    System.out.println((short)0x11f2);
    System.out.println("byte2Hex(shortToBytes((short)0xf1f2))"+byte2Hex(shortToBytes((short)0xf1f2)));
    System.out.print("println 0xf1f2:");
    System.out.println((short)0xf1f2);
    System.out.print("println bytesToShort(shortToBytes((short)0x11f2)):");
    System.out.println((short)bytesToShort(shortToBytes((short)0x11f2)));
    System.out.print("println bytesToShort(shortToBytes((short)0xf1f2)):");
    System.out.println((short)bytesToShort(shortToBytes((short)0xf1f2)));
  }
  public static byte[] ushortToBytes(int n) {
    byte[] b = new byte[2];
    b[1] = (byte) (n & 0xff);
    b[0] = (byte) (n >> 8 & 0xff);
    return b;
  }
  public static int bytesToUshort(byte b[]) {
    return  b[1] & 0xff
        | (b[0] & 0xff) << 8;
  }
  static void testUshortConvert(){
    System.out.println("=================== Ushort convert =============");
    System.out.println("byte2Hex(ushortToBytes(0x11f2))"+byte2Hex(ushortToBytes(0x11f2)));
    System.out.print("println 0x11f2:");
    System.out.println(0x11f2);
    System.out.println("byte2Hex(ushortToBytes(0xf1f2))"+byte2Hex(ushortToBytes(0xf1f2)));
    System.out.print("println 0xf1f2:");
    System.out.println(0xf1f2);
    System.out.print("println bytesToUshort(ushortToBytes(0x11f2)):");
    System.out.println(bytesToUshort(ushortToBytes(0x11f2)));
    System.out.print("println bytesToUshort(ushortToBytes(0xf1f2)):");
    System.out.println(bytesToUshort(ushortToBytes(0xf1f2)));
  }
  public static byte[] ubyteToBytes( int n ){
    byte[] b = new byte[1];
    b[0] = (byte) (n & 0xff);
    return b;
  }
  public static int bytesToUbyte( byte[] array ){
    return array[0] & 0xff;
  }
  static void testUbyteConvert(){
    System.out.println("=================== Ubyte convert =============");
    System.out.println("byte2Hex(ubyteToBytes(0x1112))"+byte2Hex(ubyteToBytes(0x1112)));
    System.out.print("println 0x1112:");
    System.out.println(0x1112);
    System.out.println("byte2Hex(ubyteToBytes(0xf2))"+byte2Hex(ubyteToBytes(0xf2)));
    System.out.print("println 0xf2:");
    System.out.println(0xf2);
    System.out.print("println bytesToUbyte(ubyteToBytes(0x1112)):");
    System.out.println(bytesToUbyte(ubyteToBytes(0x1112)));
    System.out.print("println bytesToUbyte(ubyteToBytes(0xf1f2)):");
    System.out.println(bytesToUbyte(ubyteToBytes(0xf1f2)));
  }
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    byte[] array = new byte[4];
    array[3] = (byte) 0xF4;
    array[2] = 0x13;
    array[1] = 0x12;
    array[0] = 0x11;
    System.out.println("=================== Integer bytes =============");
    System.out.println("the bytes is:"+byte2Hex(array) );
    System.out.print("println bytesToInt :");
    System.out.println( bytesToInt(array));
    System.out.printf("printf bytesToInt :%X\n", bytesToInt(array));
    System.out.println("=================== long bytes =============");
    byte[] longBytes = new byte[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( "the bytes is:"+byte2Hex(longBytes) );
    System.out.printf("printf bytesToLong:%X\n",bytesToLong(longBytes));
    System.out.println("=================byte to long ================");
    byte b = (byte)0xf1;
    System.out.print("Println the byte:");
    System.out.println(b);
    System.out.printf("Printf the byte:%X\n",b);
    long l = b;
    System.out.print("Println byte to long:");
    System.out.println(l);
    System.out.printf("printf byte to long:%X\n",l);
    System.out.println("================= uint Bytes ================");
    byte[] uint = new byte[4];
    uint[3] = (byte) 0xf3;
    uint[2] = (byte) 0x12;
    uint[1] = (byte) 0xf1;
    uint[0] = (byte) 0xFF;
    System.out.println( "the bytes is:"+byte2Hex(uint) );
    System.out.printf("printf bytesToUint:%X\n",bytesToUint(uint));
    System.out.print("Println bytesToUint:");
    System.out.println(bytesToUint(uint));
    System.out.println("byte2Hex(uintToBytes(0x11f2f3f4f5f6f7f8l)):"+byte2Hex(uintToBytes(0x11f2f3f4f5f6f7f8l)));
    System.out.println("===============Long Integer==============");
    System.out.print("println 0x11f2f3f4f5f6f7f8l:");
    System.out.println(0x11f2f3f4f5f6f7f8l);
    System.out.printf("Printf 0x11f2f3f4f5f6f7f8l:%X\n",0x11f2f3f4f5f6f7f8l);
    System.out.println("println byte2Hex(longToBytes(0x11f2f3f4f5f6f7f8l))"+byte2Hex(longToBytes(0x11f2f3f4f5f6f7f8l)));
    // 注意,下面的这行,并不能获得正确的uint。
    System.out.printf("printf bytesToUint(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程序设计有所帮助。

原文链接:http://www.cnblogs.com/devinzhang/archive/2012/09/28/2707605.html