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  }