github.com/RomiChan/protobuf@v0.1.1-0.20230204044148-2ed269a2e54d/proto/encode.go (about) 1 package proto 2 3 import ( 4 "unsafe" 5 ) 6 7 func encodeZigZag64(v int64) uint64 { 8 return (uint64(v) << 1) ^ uint64(v>>63) 9 } 10 11 type encodeFunc = func([]byte, unsafe.Pointer, *structField) []byte 12 13 func appendVarint(b []byte, v uint64) []byte { 14 switch { 15 case v < 1<<7: 16 b = append(b, byte(v)) 17 case v < 1<<14: 18 b = append(b, 19 byte((v>>0)&0x7f|0x80), 20 byte(v>>7)) 21 case v < 1<<21: 22 b = append(b, 23 byte((v>>0)&0x7f|0x80), 24 byte((v>>7)&0x7f|0x80), 25 byte(v>>14)) 26 case v < 1<<28: 27 b = append(b, 28 byte((v>>0)&0x7f|0x80), 29 byte((v>>7)&0x7f|0x80), 30 byte((v>>14)&0x7f|0x80), 31 byte(v>>21)) 32 case v < 1<<35: 33 b = append(b, 34 byte((v>>0)&0x7f|0x80), 35 byte((v>>7)&0x7f|0x80), 36 byte((v>>14)&0x7f|0x80), 37 byte((v>>21)&0x7f|0x80), 38 byte(v>>28)) 39 case v < 1<<42: 40 b = append(b, 41 byte((v>>0)&0x7f|0x80), 42 byte((v>>7)&0x7f|0x80), 43 byte((v>>14)&0x7f|0x80), 44 byte((v>>21)&0x7f|0x80), 45 byte((v>>28)&0x7f|0x80), 46 byte(v>>35)) 47 case v < 1<<49: 48 b = append(b, 49 byte((v>>0)&0x7f|0x80), 50 byte((v>>7)&0x7f|0x80), 51 byte((v>>14)&0x7f|0x80), 52 byte((v>>21)&0x7f|0x80), 53 byte((v>>28)&0x7f|0x80), 54 byte((v>>35)&0x7f|0x80), 55 byte(v>>42)) 56 case v < 1<<56: 57 b = append(b, 58 byte((v>>0)&0x7f|0x80), 59 byte((v>>7)&0x7f|0x80), 60 byte((v>>14)&0x7f|0x80), 61 byte((v>>21)&0x7f|0x80), 62 byte((v>>28)&0x7f|0x80), 63 byte((v>>35)&0x7f|0x80), 64 byte((v>>42)&0x7f|0x80), 65 byte(v>>49)) 66 case v < 1<<63: 67 b = append(b, 68 byte((v>>0)&0x7f|0x80), 69 byte((v>>7)&0x7f|0x80), 70 byte((v>>14)&0x7f|0x80), 71 byte((v>>21)&0x7f|0x80), 72 byte((v>>28)&0x7f|0x80), 73 byte((v>>35)&0x7f|0x80), 74 byte((v>>42)&0x7f|0x80), 75 byte((v>>49)&0x7f|0x80), 76 byte(v>>56)) 77 default: 78 b = append(b, 79 byte((v>>0)&0x7f|0x80), 80 byte((v>>7)&0x7f|0x80), 81 byte((v>>14)&0x7f|0x80), 82 byte((v>>21)&0x7f|0x80), 83 byte((v>>28)&0x7f|0x80), 84 byte((v>>35)&0x7f|0x80), 85 byte((v>>42)&0x7f|0x80), 86 byte((v>>49)&0x7f|0x80), 87 byte((v>>56)&0x7f|0x80), 88 1) 89 } 90 return b 91 } 92 93 func appendVarintZigZag(b []byte, v int64) []byte { 94 return appendVarint(b, encodeZigZag64(v)) 95 } 96 97 func encodeLE32(b []byte, v uint32) []byte { 98 return append(b, 99 byte(v>>0), 100 byte(v>>8), 101 byte(v>>16), 102 byte(v>>24)) 103 } 104 105 func encodeLE64(b []byte, v uint64) []byte { 106 return append(b, 107 byte(v>>0), 108 byte(v>>8), 109 byte(v>>16), 110 byte(v>>24), 111 byte(v>>32), 112 byte(v>>40), 113 byte(v>>48), 114 byte(v>>56)) 115 } 116 117 func appendTag(b []byte, f fieldNumber, t wireType) []byte { 118 return appendVarint(b, uint64(f)<<3|uint64(t)) 119 }