本文實例講述了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