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