Source file src/pkg/encoding/binary/binary.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package binary
17
18 import (
19 "errors"
20 "io"
21 "math"
22 "reflect"
23 )
24
25
26
27 type ByteOrder interface {
28 Uint16([]byte) uint16
29 Uint32([]byte) uint32
30 Uint64([]byte) uint64
31 PutUint16([]byte, uint16)
32 PutUint32([]byte, uint32)
33 PutUint64([]byte, uint64)
34 String() string
35 }
36
37
38 var LittleEndian littleEndian
39
40
41 var BigEndian bigEndian
42
43 type littleEndian struct{}
44
45 func (littleEndian) Uint16(b []byte) uint16 { return uint16(b[0]) | uint16(b[1])<<8 }
46
47 func (littleEndian) PutUint16(b []byte, v uint16) {
48 b[0] = byte(v)
49 b[1] = byte(v >> 8)
50 }
51
52 func (littleEndian) Uint32(b []byte) uint32 {
53 return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
54 }
55
56 func (littleEndian) PutUint32(b []byte, v uint32) {
57 b[0] = byte(v)
58 b[1] = byte(v >> 8)
59 b[2] = byte(v >> 16)
60 b[3] = byte(v >> 24)
61 }
62
63 func (littleEndian) Uint64(b []byte) uint64 {
64 return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
65 uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
66 }
67
68 func (littleEndian) PutUint64(b []byte, v uint64) {
69 b[0] = byte(v)
70 b[1] = byte(v >> 8)
71 b[2] = byte(v >> 16)
72 b[3] = byte(v >> 24)
73 b[4] = byte(v >> 32)
74 b[5] = byte(v >> 40)
75 b[6] = byte(v >> 48)
76 b[7] = byte(v >> 56)
77 }
78
79 func (littleEndian) String() string { return "LittleEndian" }
80
81 func (littleEndian) GoString() string { return "binary.LittleEndian" }
82
83 type bigEndian struct{}
84
85 func (bigEndian) Uint16(b []byte) uint16 { return uint16(b[1]) | uint16(b[0])<<8 }
86
87 func (bigEndian) PutUint16(b []byte, v uint16) {
88 b[0] = byte(v >> 8)
89 b[1] = byte(v)
90 }
91
92 func (bigEndian) Uint32(b []byte) uint32 {
93 return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
94 }
95
96 func (bigEndian) PutUint32(b []byte, v uint32) {
97 b[0] = byte(v >> 24)
98 b[1] = byte(v >> 16)
99 b[2] = byte(v >> 8)
100 b[3] = byte(v)
101 }
102
103 func (bigEndian) Uint64(b []byte) uint64 {
104 return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
105 uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
106 }
107
108 func (bigEndian) PutUint64(b []byte, v uint64) {
109 b[0] = byte(v >> 56)
110 b[1] = byte(v >> 48)
111 b[2] = byte(v >> 40)
112 b[3] = byte(v >> 32)
113 b[4] = byte(v >> 24)
114 b[5] = byte(v >> 16)
115 b[6] = byte(v >> 8)
116 b[7] = byte(v)
117 }
118
119 func (bigEndian) String() string { return "BigEndian" }
120
121 func (bigEndian) GoString() string { return "binary.BigEndian" }
122
123
124
125
126
127
128
129
130
131 func Read(r io.Reader, order ByteOrder, data interface{}) error {
132
133 if n := intDestSize(data); n != 0 {
134 var b [8]byte
135 bs := b[:n]
136 if _, err := io.ReadFull(r, bs); err != nil {
137 return err
138 }
139 switch v := data.(type) {
140 case *int8:
141 *v = int8(b[0])
142 case *uint8:
143 *v = b[0]
144 case *int16:
145 *v = int16(order.Uint16(bs))
146 case *uint16:
147 *v = order.Uint16(bs)
148 case *int32:
149 *v = int32(order.Uint32(bs))
150 case *uint32:
151 *v = order.Uint32(bs)
152 case *int64:
153 *v = int64(order.Uint64(bs))
154 case *uint64:
155 *v = order.Uint64(bs)
156 }
157 return nil
158 }
159
160
161 var v reflect.Value
162 switch d := reflect.ValueOf(data); d.Kind() {
163 case reflect.Ptr:
164 v = d.Elem()
165 case reflect.Slice:
166 v = d
167 default:
168 return errors.New("binary.Read: invalid type " + d.Type().String())
169 }
170 size, err := dataSize(v)
171 if err != nil {
172 return errors.New("binary.Read: " + err.Error())
173 }
174 d := &decoder{order: order, buf: make([]byte, size)}
175 if _, err := io.ReadFull(r, d.buf); err != nil {
176 return err
177 }
178 d.value(v)
179 return nil
180 }
181
182
183
184
185
186
187
188
189 func Write(w io.Writer, order ByteOrder, data interface{}) error {
190
191 var b [8]byte
192 var bs []byte
193 switch v := data.(type) {
194 case *int8:
195 bs = b[:1]
196 b[0] = byte(*v)
197 case int8:
198 bs = b[:1]
199 b[0] = byte(v)
200 case *uint8:
201 bs = b[:1]
202 b[0] = *v
203 case uint8:
204 bs = b[:1]
205 b[0] = byte(v)
206 case *int16:
207 bs = b[:2]
208 order.PutUint16(bs, uint16(*v))
209 case int16:
210 bs = b[:2]
211 order.PutUint16(bs, uint16(v))
212 case *uint16:
213 bs = b[:2]
214 order.PutUint16(bs, *v)
215 case uint16:
216 bs = b[:2]
217 order.PutUint16(bs, v)
218 case *int32:
219 bs = b[:4]
220 order.PutUint32(bs, uint32(*v))
221 case int32:
222 bs = b[:4]
223 order.PutUint32(bs, uint32(v))
224 case *uint32:
225 bs = b[:4]
226 order.PutUint32(bs, *v)
227 case uint32:
228 bs = b[:4]
229 order.PutUint32(bs, v)
230 case *int64:
231 bs = b[:8]
232 order.PutUint64(bs, uint64(*v))
233 case int64:
234 bs = b[:8]
235 order.PutUint64(bs, uint64(v))
236 case *uint64:
237 bs = b[:8]
238 order.PutUint64(bs, *v)
239 case uint64:
240 bs = b[:8]
241 order.PutUint64(bs, v)
242 }
243 if bs != nil {
244 _, err := w.Write(bs)
245 return err
246 }
247
248
249 v := reflect.Indirect(reflect.ValueOf(data))
250 size, err := dataSize(v)
251 if err != nil {
252 return errors.New("binary.Write: " + err.Error())
253 }
254 buf := make([]byte, size)
255 e := &encoder{order: order, buf: buf}
256 e.value(v)
257 _, err = w.Write(buf)
258 return err
259 }
260
261
262
263 func Size(v interface{}) int {
264 n, err := dataSize(reflect.Indirect(reflect.ValueOf(v)))
265 if err != nil {
266 return -1
267 }
268 return n
269 }
270
271
272
273
274
275 func dataSize(v reflect.Value) (int, error) {
276 if v.Kind() == reflect.Slice {
277 elem, err := sizeof(v.Type().Elem())
278 if err != nil {
279 return 0, err
280 }
281 return v.Len() * elem, nil
282 }
283 return sizeof(v.Type())
284 }
285
286 func sizeof(t reflect.Type) (int, error) {
287 switch t.Kind() {
288 case reflect.Array:
289 n, err := sizeof(t.Elem())
290 if err != nil {
291 return 0, err
292 }
293 return t.Len() * n, nil
294
295 case reflect.Struct:
296 sum := 0
297 for i, n := 0, t.NumField(); i < n; i++ {
298 s, err := sizeof(t.Field(i).Type)
299 if err != nil {
300 return 0, err
301 }
302 sum += s
303 }
304 return sum, nil
305
306 case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
307 reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
308 reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128:
309 return int(t.Size()), nil
310 }
311 return 0, errors.New("invalid type " + t.String())
312 }
313
314 type coder struct {
315 order ByteOrder
316 buf []byte
317 }
318
319 type decoder coder
320 type encoder coder
321
322 func (d *decoder) uint8() uint8 {
323 x := d.buf[0]
324 d.buf = d.buf[1:]
325 return x
326 }
327
328 func (e *encoder) uint8(x uint8) {
329 e.buf[0] = x
330 e.buf = e.buf[1:]
331 }
332
333 func (d *decoder) uint16() uint16 {
334 x := d.order.Uint16(d.buf[0:2])
335 d.buf = d.buf[2:]
336 return x
337 }
338
339 func (e *encoder) uint16(x uint16) {
340 e.order.PutUint16(e.buf[0:2], x)
341 e.buf = e.buf[2:]
342 }
343
344 func (d *decoder) uint32() uint32 {
345 x := d.order.Uint32(d.buf[0:4])
346 d.buf = d.buf[4:]
347 return x
348 }
349
350 func (e *encoder) uint32(x uint32) {
351 e.order.PutUint32(e.buf[0:4], x)
352 e.buf = e.buf[4:]
353 }
354
355 func (d *decoder) uint64() uint64 {
356 x := d.order.Uint64(d.buf[0:8])
357 d.buf = d.buf[8:]
358 return x
359 }
360
361 func (e *encoder) uint64(x uint64) {
362 e.order.PutUint64(e.buf[0:8], x)
363 e.buf = e.buf[8:]
364 }
365
366 func (d *decoder) int8() int8 { return int8(d.uint8()) }
367
368 func (e *encoder) int8(x int8) { e.uint8(uint8(x)) }
369
370 func (d *decoder) int16() int16 { return int16(d.uint16()) }
371
372 func (e *encoder) int16(x int16) { e.uint16(uint16(x)) }
373
374 func (d *decoder) int32() int32 { return int32(d.uint32()) }
375
376 func (e *encoder) int32(x int32) { e.uint32(uint32(x)) }
377
378 func (d *decoder) int64() int64 { return int64(d.uint64()) }
379
380 func (e *encoder) int64(x int64) { e.uint64(uint64(x)) }
381
382 func (d *decoder) value(v reflect.Value) {
383 switch v.Kind() {
384 case reflect.Array:
385 l := v.Len()
386 for i := 0; i < l; i++ {
387 d.value(v.Index(i))
388 }
389
390 case reflect.Struct:
391 t := v.Type()
392 l := v.NumField()
393 for i := 0; i < l; i++ {
394
395
396
397
398
399 if v := v.Field(i); v.CanSet() || t.Field(i).Name != "_" {
400 d.value(v)
401 } else {
402 d.skip(v)
403 }
404 }
405
406 case reflect.Slice:
407 l := v.Len()
408 for i := 0; i < l; i++ {
409 d.value(v.Index(i))
410 }
411
412 case reflect.Int8:
413 v.SetInt(int64(d.int8()))
414 case reflect.Int16:
415 v.SetInt(int64(d.int16()))
416 case reflect.Int32:
417 v.SetInt(int64(d.int32()))
418 case reflect.Int64:
419 v.SetInt(d.int64())
420
421 case reflect.Uint8:
422 v.SetUint(uint64(d.uint8()))
423 case reflect.Uint16:
424 v.SetUint(uint64(d.uint16()))
425 case reflect.Uint32:
426 v.SetUint(uint64(d.uint32()))
427 case reflect.Uint64:
428 v.SetUint(d.uint64())
429
430 case reflect.Float32:
431 v.SetFloat(float64(math.Float32frombits(d.uint32())))
432 case reflect.Float64:
433 v.SetFloat(math.Float64frombits(d.uint64()))
434
435 case reflect.Complex64:
436 v.SetComplex(complex(
437 float64(math.Float32frombits(d.uint32())),
438 float64(math.Float32frombits(d.uint32())),
439 ))
440 case reflect.Complex128:
441 v.SetComplex(complex(
442 math.Float64frombits(d.uint64()),
443 math.Float64frombits(d.uint64()),
444 ))
445 }
446 }
447
448 func (e *encoder) value(v reflect.Value) {
449 switch v.Kind() {
450 case reflect.Array:
451 l := v.Len()
452 for i := 0; i < l; i++ {
453 e.value(v.Index(i))
454 }
455
456 case reflect.Struct:
457 t := v.Type()
458 l := v.NumField()
459 for i := 0; i < l; i++ {
460
461 if v := v.Field(i); v.CanSet() || t.Field(i).Name != "_" {
462 e.value(v)
463 } else {
464 e.skip(v)
465 }
466 }
467
468 case reflect.Slice:
469 l := v.Len()
470 for i := 0; i < l; i++ {
471 e.value(v.Index(i))
472 }
473
474 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
475 switch v.Type().Kind() {
476 case reflect.Int8:
477 e.int8(int8(v.Int()))
478 case reflect.Int16:
479 e.int16(int16(v.Int()))
480 case reflect.Int32:
481 e.int32(int32(v.Int()))
482 case reflect.Int64:
483 e.int64(v.Int())
484 }
485
486 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
487 switch v.Type().Kind() {
488 case reflect.Uint8:
489 e.uint8(uint8(v.Uint()))
490 case reflect.Uint16:
491 e.uint16(uint16(v.Uint()))
492 case reflect.Uint32:
493 e.uint32(uint32(v.Uint()))
494 case reflect.Uint64:
495 e.uint64(v.Uint())
496 }
497
498 case reflect.Float32, reflect.Float64:
499 switch v.Type().Kind() {
500 case reflect.Float32:
501 e.uint32(math.Float32bits(float32(v.Float())))
502 case reflect.Float64:
503 e.uint64(math.Float64bits(v.Float()))
504 }
505
506 case reflect.Complex64, reflect.Complex128:
507 switch v.Type().Kind() {
508 case reflect.Complex64:
509 x := v.Complex()
510 e.uint32(math.Float32bits(float32(real(x))))
511 e.uint32(math.Float32bits(float32(imag(x))))
512 case reflect.Complex128:
513 x := v.Complex()
514 e.uint64(math.Float64bits(real(x)))
515 e.uint64(math.Float64bits(imag(x)))
516 }
517 }
518 }
519
520 func (d *decoder) skip(v reflect.Value) {
521 n, _ := dataSize(v)
522 d.buf = d.buf[n:]
523 }
524
525 func (e *encoder) skip(v reflect.Value) {
526 n, _ := dataSize(v)
527 for i := range e.buf[0:n] {
528 e.buf[i] = 0
529 }
530 e.buf = e.buf[n:]
531 }
532
533
534
535 func intDestSize(ptrType interface{}) int {
536 switch ptrType.(type) {
537 case *int8, *uint8:
538 return 1
539 case *int16, *uint16:
540 return 2
541 case *int32, *uint32:
542 return 4
543 case *int64, *uint64:
544 return 8
545 }
546 return 0
547 }
View as plain text