encodeListPackInt encodes an integer for listpack
(val int64)
| 760 | |
| 761 | // encodeListPackInt encodes an integer for listpack |
| 762 | func (enc *Encoder) encodeListPackInt(val int64) []byte { |
| 763 | if val >= -127 && val <= 127 { |
| 764 | // 0xxxxxxx, uint7 |
| 765 | return []byte{byte(val)} |
| 766 | } else if val >= -8191 && val <= 8191 { |
| 767 | // 110xxxxx yyyyyyyy, int13 |
| 768 | uval := uint16(val) |
| 769 | if val < 0 { |
| 770 | uval = uint16(8191 + val + 1) |
| 771 | } |
| 772 | return []byte{ |
| 773 | byte(0xC0 | (uval >> 8)), |
| 774 | byte(uval & 0xFF), |
| 775 | } |
| 776 | } else if val >= -32767 && val <= 32767 { |
| 777 | // 11110001 aaaaaaaa bbbbbbbb, int16 |
| 778 | uval := uint16(val) |
| 779 | return []byte{ |
| 780 | 0xF1, |
| 781 | byte(uval & 0xFF), |
| 782 | byte(uval >> 8), |
| 783 | } |
| 784 | } else if val >= -8388607 && val <= 8388607 { |
| 785 | // 11110010 aaaaaaaa bbbbbbbb cccccccc, int24 |
| 786 | uval := uint32(val) |
| 787 | return []byte{ |
| 788 | 0xF2, |
| 789 | byte(uval & 0xFF), |
| 790 | byte((uval >> 8) & 0xFF), |
| 791 | byte((uval >> 16) & 0xFF), |
| 792 | } |
| 793 | } else if val >= -2147483647 && val <= 2147483647 { |
| 794 | // 11110011 aaaaaaaa bbbbbbbb cccccccc dddddddd, int32 |
| 795 | uval := uint32(val) |
| 796 | return []byte{ |
| 797 | 0xF3, |
| 798 | byte(uval & 0xFF), |
| 799 | byte((uval >> 8) & 0xFF), |
| 800 | byte((uval >> 16) & 0xFF), |
| 801 | byte((uval >> 24) & 0xFF), |
| 802 | } |
| 803 | } else { |
| 804 | // 11110100 8Byte -> int64 |
| 805 | uval := uint64(val) |
| 806 | result := []byte{0xF4} |
| 807 | for i := 0; i < 8; i++ { |
| 808 | result = append(result, byte(uval&0xFF)) |
| 809 | uval >>= 8 |
| 810 | } |
| 811 | return result |
| 812 | } |
| 813 | } |
| 814 | |
| 815 | // encodeListPackString encodes a string for listpack |
| 816 | func (enc *Encoder) encodeListPackString(s string) []byte { |
no outgoing calls
no test coverage detected