9fans.net/go@v0.0.5/draw/drawfcall/bit.go (about) 1 package drawfcall // import "9fans.net/go/draw/drawfcall" 2 3 // Note that these are big-endian, unlike Plan 9 fcalls, which are little-endian. 4 5 func gbit8(b []byte) (uint8, []byte) { 6 return uint8(b[0]), b[1:] 7 } 8 9 func gbit16(b []byte) (uint16, []byte) { 10 return uint16(b[1]) | uint16(b[0])<<8, b[2:] 11 } 12 13 func gbit32(b []byte) (int, []byte) { 14 return int(uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24), b[4:] 15 } 16 17 func gbit64(b []byte) (uint64, []byte) { 18 hi, b := gbit32(b) 19 lo, b := gbit32(b) 20 return uint64(hi)<<32 | uint64(lo), b 21 } 22 23 func gstring(b []byte) (string, []byte) { 24 n, b := gbit32(b) 25 return string(b[0:n]), b[n:] 26 } 27 28 func gbytes(b []byte) ([]byte, []byte) { 29 n, b := gbit32(b) 30 return b[0:n], b[n:] 31 } 32 33 func pbit8(b []byte, x uint8) []byte { 34 n := len(b) 35 if n+1 > cap(b) { 36 nb := make([]byte, n, 100+2*cap(b)) 37 copy(nb, b) 38 b = nb 39 } 40 b = b[0 : n+1] 41 b[n] = x 42 return b 43 } 44 45 func pbit16(b []byte, x uint16) []byte { 46 n := len(b) 47 if n+2 > cap(b) { 48 nb := make([]byte, n, 100+2*cap(b)) 49 copy(nb, b) 50 b = nb 51 } 52 b = b[0 : n+2] 53 b[n] = byte(x >> 8) 54 b[n+1] = byte(x) 55 return b 56 } 57 58 func pbit32(b []byte, i int) []byte { 59 x := uint32(i) 60 n := len(b) 61 if n+4 > cap(b) { 62 nb := make([]byte, n, 100+2*cap(b)) 63 copy(nb, b) 64 b = nb 65 } 66 b = b[0 : n+4] 67 b[n] = byte(x >> 24) 68 b[n+1] = byte(x >> 16) 69 b[n+2] = byte(x >> 8) 70 b[n+3] = byte(x) 71 return b 72 } 73 74 func pbit64(b []byte, x uint64) []byte { 75 b = pbit32(b, int(x>>32)) 76 b = pbit32(b, int(x)) 77 return b 78 } 79 80 func pstring(b []byte, s string) []byte { 81 b = pbit32(b, len(s)) 82 b = append(b, []byte(s)...) 83 return b 84 } 85 86 func pbytes(b, s []byte) []byte { 87 b = pbit32(b, len(s)) 88 b = append(b, s...) 89 return b 90 }