| 720 | return struct.unpack_from(">q", buf, ri)[0] |
| 721 | |
| 722 | def read_long(self): |
| 723 | self.ensure_read(1) |
| 724 | ri = self.ri |
| 725 | self.ri = ri + 1 |
| 726 | b = self.buf[ri] |
| 727 | h = b >> 3 |
| 728 | # @formatter:off |
| 729 | if h < 0x10: |
| 730 | if h < 0x08: return b |
| 731 | if h < 0x0c: return ((b - 0x40) << 8) + self.read_long1() |
| 732 | if h < 0x0e: return ((b - 0x60) << 16) + self.read_long2_be() |
| 733 | if h == 0x0e: return ((b - 0x70) << 24) + self.read_long3_be() |
| 734 | h = b & 7 |
| 735 | if h < 4: return ((b - 0x78) << 32) + self.read_long4_be() |
| 736 | if h < 6: return ((b - 0x7c) << 40) + self.read_long5_be() |
| 737 | if h == 6: return self.read_long6_be() |
| 738 | r = self.read_long7_be() |
| 739 | return r if r < 0x80_0000_0000_0000 else ((r - 0x80_0000_0000_0000) << 8) + self.read_long1() |
| 740 | else: |
| 741 | b -= 0x100 |
| 742 | if h >= 0x18: return b |
| 743 | if h >= 0x14: return ((b + 0x40) << 8) + self.read_long1() |
| 744 | if h >= 0x12: return ((b + 0x60) << 16) + self.read_long2_be() |
| 745 | if h == 0x11: return ((b + 0x70) << 24) + self.read_long3_be() |
| 746 | h = b & 7 |
| 747 | if h >= 4: return ((b + 0x78) << 32) + self.read_long4_be() |
| 748 | if h >= 2: return ((b + 0x7c) << 40) + self.read_long5_be() |
| 749 | if h == 1: return -0x1_0000_0000_0000 + self.read_long6_be() |
| 750 | r = self.read_long7_be() |
| 751 | return -0x100_0000_0000_0000 + r if r >= 0x80_0000_0000_0000 else ((r - 0x80_0000_0000_0000) << 8) + self.read_long1() |
| 752 | # @formatter:on |
| 753 | |
| 754 | def skip_long(self): |
| 755 | self.ensure_read(1) |