github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/encoding/binary/binary.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package binary implements simple translation between numbers and byte 6 // sequences and encoding and decoding of varints. 7 // 8 // Numbers are translated by reading and writing fixed-size values. 9 // A fixed-size value is either a fixed-size arithmetic 10 // type (int8, uint8, int16, float32, complex64, ...) 11 // or an array or struct containing only fixed-size values. 12 // 13 // The varint functions encode and decode single integer values using 14 // a variable-length encoding; smaller values require fewer bytes. 15 // For a specification, see 16 // https://developers.google.com/protocol-buffers/docs/encoding. 17 // 18 // This package favors simplicity over efficiency. Clients that require 19 // high-performance serialization, especially for large data structures, 20 // should look at more advanced solutions such as the encoding/gob 21 // package or protocol buffers. 22 package binary 23 24 import ( 25 "errors" 26 "io" 27 "math" 28 "reflect" 29 ) 30 31 // A ByteOrder specifies how to convert byte sequences into 32 // 16-, 32-, or 64-bit unsigned integers. 33 type ByteOrder interface { 34 Uint16([]byte) uint16 35 Uint32([]byte) uint32 36 Uint64([]byte) uint64 37 PutUint16([]byte, uint16) 38 PutUint32([]byte, uint32) 39 PutUint64([]byte, uint64) 40 String() string 41 } 42 43 // LittleEndian is the little-endian implementation of ByteOrder. 44 var LittleEndian littleEndian 45 46 // BigEndian is the big-endian implementation of ByteOrder. 47 var BigEndian bigEndian 48 49 type littleEndian struct{} 50 51 func (littleEndian) Uint16(b []byte) uint16 { 52 _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 53 return uint16(b[0]) | uint16(b[1])<<8 54 } 55 56 func (littleEndian) PutUint16(b []byte, v uint16) { 57 _ = b[1] // early bounds check to guarantee safety of writes below 58 b[0] = byte(v) 59 b[1] = byte(v >> 8) 60 } 61 62 func (littleEndian) Uint32(b []byte) uint32 { 63 _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 64 return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 65 } 66 67 func (littleEndian) PutUint32(b []byte, v uint32) { 68 _ = b[3] // early bounds check to guarantee safety of writes below 69 b[0] = byte(v) 70 b[1] = byte(v >> 8) 71 b[2] = byte(v >> 16) 72 b[3] = byte(v >> 24) 73 } 74 75 func (littleEndian) Uint64(b []byte) uint64 { 76 _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 77 return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | 78 uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 79 } 80 81 func (littleEndian) PutUint64(b []byte, v uint64) { 82 _ = b[7] // early bounds check to guarantee safety of writes below 83 b[0] = byte(v) 84 b[1] = byte(v >> 8) 85 b[2] = byte(v >> 16) 86 b[3] = byte(v >> 24) 87 b[4] = byte(v >> 32) 88 b[5] = byte(v >> 40) 89 b[6] = byte(v >> 48) 90 b[7] = byte(v >> 56) 91 } 92 93 func (littleEndian) String() string { return "LittleEndian" } 94 95 func (littleEndian) GoString() string { return "binary.LittleEndian" } 96 97 type bigEndian struct{} 98 99 func (bigEndian) Uint16(b []byte) uint16 { 100 _ = b[1] // bounds check hint to compiler; see golang.org/issue/14808 101 return uint16(b[1]) | uint16(b[0])<<8 102 } 103 104 func (bigEndian) PutUint16(b []byte, v uint16) { 105 _ = b[1] // early bounds check to guarantee safety of writes below 106 b[0] = byte(v >> 8) 107 b[1] = byte(v) 108 } 109 110 func (bigEndian) Uint32(b []byte) uint32 { 111 _ = b[3] // bounds check hint to compiler; see golang.org/issue/14808 112 return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 113 } 114 115 func (bigEndian) PutUint32(b []byte, v uint32) { 116 _ = b[3] // early bounds check to guarantee safety of writes below 117 b[0] = byte(v >> 24) 118 b[1] = byte(v >> 16) 119 b[2] = byte(v >> 8) 120 b[3] = byte(v) 121 } 122 123 func (bigEndian) Uint64(b []byte) uint64 { 124 _ = b[7] // bounds check hint to compiler; see golang.org/issue/14808 125 return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 | 126 uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56 127 } 128 129 func (bigEndian) PutUint64(b []byte, v uint64) { 130 _ = b[7] // early bounds check to guarantee safety of writes below 131 b[0] = byte(v >> 56) 132 b[1] = byte(v >> 48) 133 b[2] = byte(v >> 40) 134 b[3] = byte(v >> 32) 135 b[4] = byte(v >> 24) 136 b[5] = byte(v >> 16) 137 b[6] = byte(v >> 8) 138 b[7] = byte(v) 139 } 140 141 func (bigEndian) String() string { return "BigEndian" } 142 143 func (bigEndian) GoString() string { return "binary.BigEndian" } 144 145 // Read reads structured binary data from r into data. 146 // Data must be a pointer to a fixed-size value or a slice 147 // of fixed-size values. 148 // Bytes read from r are decoded using the specified byte order 149 // and written to successive fields of the data. 150 // When reading into structs, the field data for fields with 151 // blank (_) field names is skipped; i.e., blank field names 152 // may be used for padding. 153 // When reading into a struct, all non-blank fields must be exported. 154 // 155 // The error is EOF only if no bytes were read. 156 // If an EOF happens after reading some but not all the bytes, 157 // Read returns ErrUnexpectedEOF. 158 func Read(r io.Reader, order ByteOrder, data interface{}) error { 159 // Fast path for basic types and slices. 160 if n := intDataSize(data); n != 0 { 161 var b [8]byte 162 var bs []byte 163 if n > len(b) { 164 bs = make([]byte, n) 165 } else { 166 bs = b[:n] 167 } 168 if _, err := io.ReadFull(r, bs); err != nil { 169 return err 170 } 171 switch data := data.(type) { 172 case *bool: 173 *data = b[0] != 0 174 case *int8: 175 *data = int8(b[0]) 176 case *uint8: 177 *data = b[0] 178 case *int16: 179 *data = int16(order.Uint16(bs)) 180 case *uint16: 181 *data = order.Uint16(bs) 182 case *int32: 183 *data = int32(order.Uint32(bs)) 184 case *uint32: 185 *data = order.Uint32(bs) 186 case *int64: 187 *data = int64(order.Uint64(bs)) 188 case *uint64: 189 *data = order.Uint64(bs) 190 case []bool: 191 for i, x := range bs { // Easier to loop over the input for 8-bit values. 192 data[i] = x != 0 193 } 194 case []int8: 195 for i, x := range bs { 196 data[i] = int8(x) 197 } 198 case []uint8: 199 copy(data, bs) 200 case []int16: 201 for i := range data { 202 data[i] = int16(order.Uint16(bs[2*i:])) 203 } 204 case []uint16: 205 for i := range data { 206 data[i] = order.Uint16(bs[2*i:]) 207 } 208 case []int32: 209 for i := range data { 210 data[i] = int32(order.Uint32(bs[4*i:])) 211 } 212 case []uint32: 213 for i := range data { 214 data[i] = order.Uint32(bs[4*i:]) 215 } 216 case []int64: 217 for i := range data { 218 data[i] = int64(order.Uint64(bs[8*i:])) 219 } 220 case []uint64: 221 for i := range data { 222 data[i] = order.Uint64(bs[8*i:]) 223 } 224 } 225 return nil 226 } 227 228 // Fallback to reflect-based decoding. 229 v := reflect.ValueOf(data) 230 size := -1 231 switch v.Kind() { 232 case reflect.Ptr: 233 v = v.Elem() 234 size = dataSize(v) 235 case reflect.Slice: 236 size = dataSize(v) 237 } 238 if size < 0 { 239 return errors.New("binary.Read: invalid type " + reflect.TypeOf(data).String()) 240 } 241 d := &decoder{order: order, buf: make([]byte, size)} 242 if _, err := io.ReadFull(r, d.buf); err != nil { 243 return err 244 } 245 d.value(v) 246 return nil 247 } 248 249 // Write writes the binary representation of data into w. 250 // Data must be a fixed-size value or a slice of fixed-size 251 // values, or a pointer to such data. 252 // Bytes written to w are encoded using the specified byte order 253 // and read from successive fields of the data. 254 // When writing structs, zero values are written for fields 255 // with blank (_) field names. 256 func Write(w io.Writer, order ByteOrder, data interface{}) error { 257 // Fast path for basic types and slices. 258 if n := intDataSize(data); n != 0 { 259 var b [8]byte 260 var bs []byte 261 if n > len(b) { 262 bs = make([]byte, n) 263 } else { 264 bs = b[:n] 265 } 266 switch v := data.(type) { 267 case *bool: 268 if *v { 269 b[0] = 1 270 } else { 271 b[0] = 0 272 } 273 case bool: 274 if v { 275 b[0] = 1 276 } else { 277 b[0] = 0 278 } 279 case []bool: 280 for i, x := range v { 281 if x { 282 bs[i] = 1 283 } else { 284 bs[i] = 0 285 } 286 } 287 case *int8: 288 b[0] = byte(*v) 289 case int8: 290 b[0] = byte(v) 291 case []int8: 292 for i, x := range v { 293 bs[i] = byte(x) 294 } 295 case *uint8: 296 b[0] = *v 297 case uint8: 298 b[0] = v 299 case []uint8: 300 bs = v 301 case *int16: 302 order.PutUint16(bs, uint16(*v)) 303 case int16: 304 order.PutUint16(bs, uint16(v)) 305 case []int16: 306 for i, x := range v { 307 order.PutUint16(bs[2*i:], uint16(x)) 308 } 309 case *uint16: 310 order.PutUint16(bs, *v) 311 case uint16: 312 order.PutUint16(bs, v) 313 case []uint16: 314 for i, x := range v { 315 order.PutUint16(bs[2*i:], x) 316 } 317 case *int32: 318 order.PutUint32(bs, uint32(*v)) 319 case int32: 320 order.PutUint32(bs, uint32(v)) 321 case []int32: 322 for i, x := range v { 323 order.PutUint32(bs[4*i:], uint32(x)) 324 } 325 case *uint32: 326 order.PutUint32(bs, *v) 327 case uint32: 328 order.PutUint32(bs, v) 329 case []uint32: 330 for i, x := range v { 331 order.PutUint32(bs[4*i:], x) 332 } 333 case *int64: 334 order.PutUint64(bs, uint64(*v)) 335 case int64: 336 order.PutUint64(bs, uint64(v)) 337 case []int64: 338 for i, x := range v { 339 order.PutUint64(bs[8*i:], uint64(x)) 340 } 341 case *uint64: 342 order.PutUint64(bs, *v) 343 case uint64: 344 order.PutUint64(bs, v) 345 case []uint64: 346 for i, x := range v { 347 order.PutUint64(bs[8*i:], x) 348 } 349 } 350 _, err := w.Write(bs) 351 return err 352 } 353 354 // Fallback to reflect-based encoding. 355 v := reflect.Indirect(reflect.ValueOf(data)) 356 size := dataSize(v) 357 if size < 0 { 358 return errors.New("binary.Write: invalid type " + reflect.TypeOf(data).String()) 359 } 360 buf := make([]byte, size) 361 e := &encoder{order: order, buf: buf} 362 e.value(v) 363 _, err := w.Write(buf) 364 return err 365 } 366 367 // Size returns how many bytes Write would generate to encode the value v, which 368 // must be a fixed-size value or a slice of fixed-size values, or a pointer to such data. 369 // If v is neither of these, Size returns -1. 370 func Size(v interface{}) int { 371 return dataSize(reflect.Indirect(reflect.ValueOf(v))) 372 } 373 374 // dataSize returns the number of bytes the actual data represented by v occupies in memory. 375 // For compound structures, it sums the sizes of the elements. Thus, for instance, for a slice 376 // it returns the length of the slice times the element size and does not count the memory 377 // occupied by the header. If the type of v is not acceptable, dataSize returns -1. 378 func dataSize(v reflect.Value) int { 379 if v.Kind() == reflect.Slice { 380 if s := sizeof(v.Type().Elem()); s >= 0 { 381 return s * v.Len() 382 } 383 return -1 384 } 385 return sizeof(v.Type()) 386 } 387 388 // sizeof returns the size >= 0 of variables for the given type or -1 if the type is not acceptable. 389 func sizeof(t reflect.Type) int { 390 switch t.Kind() { 391 case reflect.Array: 392 if s := sizeof(t.Elem()); s >= 0 { 393 return s * t.Len() 394 } 395 396 case reflect.Struct: 397 sum := 0 398 for i, n := 0, t.NumField(); i < n; i++ { 399 s := sizeof(t.Field(i).Type) 400 if s < 0 { 401 return -1 402 } 403 sum += s 404 } 405 return sum 406 407 case reflect.Bool, 408 reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, 409 reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, 410 reflect.Float32, reflect.Float64, reflect.Complex64, reflect.Complex128: 411 return int(t.Size()) 412 } 413 414 return -1 415 } 416 417 type coder struct { 418 order ByteOrder 419 buf []byte 420 } 421 422 type decoder coder 423 type encoder coder 424 425 func (d *decoder) bool() bool { 426 x := d.buf[0] 427 d.buf = d.buf[1:] 428 return x != 0 429 } 430 431 func (e *encoder) bool(x bool) { 432 if x { 433 e.buf[0] = 1 434 } else { 435 e.buf[0] = 0 436 } 437 e.buf = e.buf[1:] 438 } 439 440 func (d *decoder) uint8() uint8 { 441 x := d.buf[0] 442 d.buf = d.buf[1:] 443 return x 444 } 445 446 func (e *encoder) uint8(x uint8) { 447 e.buf[0] = x 448 e.buf = e.buf[1:] 449 } 450 451 func (d *decoder) uint16() uint16 { 452 x := d.order.Uint16(d.buf[0:2]) 453 d.buf = d.buf[2:] 454 return x 455 } 456 457 func (e *encoder) uint16(x uint16) { 458 e.order.PutUint16(e.buf[0:2], x) 459 e.buf = e.buf[2:] 460 } 461 462 func (d *decoder) uint32() uint32 { 463 x := d.order.Uint32(d.buf[0:4]) 464 d.buf = d.buf[4:] 465 return x 466 } 467 468 func (e *encoder) uint32(x uint32) { 469 e.order.PutUint32(e.buf[0:4], x) 470 e.buf = e.buf[4:] 471 } 472 473 func (d *decoder) uint64() uint64 { 474 x := d.order.Uint64(d.buf[0:8]) 475 d.buf = d.buf[8:] 476 return x 477 } 478 479 func (e *encoder) uint64(x uint64) { 480 e.order.PutUint64(e.buf[0:8], x) 481 e.buf = e.buf[8:] 482 } 483 484 func (d *decoder) int8() int8 { return int8(d.uint8()) } 485 486 func (e *encoder) int8(x int8) { e.uint8(uint8(x)) } 487 488 func (d *decoder) int16() int16 { return int16(d.uint16()) } 489 490 func (e *encoder) int16(x int16) { e.uint16(uint16(x)) } 491 492 func (d *decoder) int32() int32 { return int32(d.uint32()) } 493 494 func (e *encoder) int32(x int32) { e.uint32(uint32(x)) } 495 496 func (d *decoder) int64() int64 { return int64(d.uint64()) } 497 498 func (e *encoder) int64(x int64) { e.uint64(uint64(x)) } 499 500 func (d *decoder) value(v reflect.Value) { 501 switch v.Kind() { 502 case reflect.Array: 503 l := v.Len() 504 for i := 0; i < l; i++ { 505 d.value(v.Index(i)) 506 } 507 508 case reflect.Struct: 509 t := v.Type() 510 l := v.NumField() 511 for i := 0; i < l; i++ { 512 // Note: Calling v.CanSet() below is an optimization. 513 // It would be sufficient to check the field name, 514 // but creating the StructField info for each field is 515 // costly (run "go test -bench=ReadStruct" and compare 516 // results when making changes to this code). 517 if v := v.Field(i); v.CanSet() || t.Field(i).Name != "_" { 518 d.value(v) 519 } else { 520 d.skip(v) 521 } 522 } 523 524 case reflect.Slice: 525 l := v.Len() 526 for i := 0; i < l; i++ { 527 d.value(v.Index(i)) 528 } 529 530 case reflect.Bool: 531 v.SetBool(d.bool()) 532 533 case reflect.Int8: 534 v.SetInt(int64(d.int8())) 535 case reflect.Int16: 536 v.SetInt(int64(d.int16())) 537 case reflect.Int32: 538 v.SetInt(int64(d.int32())) 539 case reflect.Int64: 540 v.SetInt(d.int64()) 541 542 case reflect.Uint8: 543 v.SetUint(uint64(d.uint8())) 544 case reflect.Uint16: 545 v.SetUint(uint64(d.uint16())) 546 case reflect.Uint32: 547 v.SetUint(uint64(d.uint32())) 548 case reflect.Uint64: 549 v.SetUint(d.uint64()) 550 551 case reflect.Float32: 552 v.SetFloat(float64(math.Float32frombits(d.uint32()))) 553 case reflect.Float64: 554 v.SetFloat(math.Float64frombits(d.uint64())) 555 556 case reflect.Complex64: 557 v.SetComplex(complex( 558 float64(math.Float32frombits(d.uint32())), 559 float64(math.Float32frombits(d.uint32())), 560 )) 561 case reflect.Complex128: 562 v.SetComplex(complex( 563 math.Float64frombits(d.uint64()), 564 math.Float64frombits(d.uint64()), 565 )) 566 } 567 } 568 569 func (e *encoder) value(v reflect.Value) { 570 switch v.Kind() { 571 case reflect.Array: 572 l := v.Len() 573 for i := 0; i < l; i++ { 574 e.value(v.Index(i)) 575 } 576 577 case reflect.Struct: 578 t := v.Type() 579 l := v.NumField() 580 for i := 0; i < l; i++ { 581 // see comment for corresponding code in decoder.value() 582 if v := v.Field(i); v.CanSet() || t.Field(i).Name != "_" { 583 e.value(v) 584 } else { 585 e.skip(v) 586 } 587 } 588 589 case reflect.Slice: 590 l := v.Len() 591 for i := 0; i < l; i++ { 592 e.value(v.Index(i)) 593 } 594 595 case reflect.Bool: 596 e.bool(v.Bool()) 597 598 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: 599 switch v.Type().Kind() { 600 case reflect.Int8: 601 e.int8(int8(v.Int())) 602 case reflect.Int16: 603 e.int16(int16(v.Int())) 604 case reflect.Int32: 605 e.int32(int32(v.Int())) 606 case reflect.Int64: 607 e.int64(v.Int()) 608 } 609 610 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: 611 switch v.Type().Kind() { 612 case reflect.Uint8: 613 e.uint8(uint8(v.Uint())) 614 case reflect.Uint16: 615 e.uint16(uint16(v.Uint())) 616 case reflect.Uint32: 617 e.uint32(uint32(v.Uint())) 618 case reflect.Uint64: 619 e.uint64(v.Uint()) 620 } 621 622 case reflect.Float32, reflect.Float64: 623 switch v.Type().Kind() { 624 case reflect.Float32: 625 e.uint32(math.Float32bits(float32(v.Float()))) 626 case reflect.Float64: 627 e.uint64(math.Float64bits(v.Float())) 628 } 629 630 case reflect.Complex64, reflect.Complex128: 631 switch v.Type().Kind() { 632 case reflect.Complex64: 633 x := v.Complex() 634 e.uint32(math.Float32bits(float32(real(x)))) 635 e.uint32(math.Float32bits(float32(imag(x)))) 636 case reflect.Complex128: 637 x := v.Complex() 638 e.uint64(math.Float64bits(real(x))) 639 e.uint64(math.Float64bits(imag(x))) 640 } 641 } 642 } 643 644 func (d *decoder) skip(v reflect.Value) { 645 d.buf = d.buf[dataSize(v):] 646 } 647 648 func (e *encoder) skip(v reflect.Value) { 649 n := dataSize(v) 650 for i := range e.buf[0:n] { 651 e.buf[i] = 0 652 } 653 e.buf = e.buf[n:] 654 } 655 656 // intDataSize returns the size of the data required to represent the data when encoded. 657 // It returns zero if the type cannot be implemented by the fast path in Read or Write. 658 func intDataSize(data interface{}) int { 659 switch data := data.(type) { 660 case bool, int8, uint8, *bool, *int8, *uint8: 661 return 1 662 case []int8: 663 return len(data) 664 case []uint8: 665 return len(data) 666 case int16, uint16, *int16, *uint16: 667 return 2 668 case []int16: 669 return 2 * len(data) 670 case []uint16: 671 return 2 * len(data) 672 case int32, uint32, *int32, *uint32: 673 return 4 674 case []int32: 675 return 4 * len(data) 676 case []uint32: 677 return 4 * len(data) 678 case int64, uint64, *int64, *uint64: 679 return 8 680 case []int64: 681 return 8 * len(data) 682 case []uint64: 683 return 8 * len(data) 684 } 685 return 0 686 }