| 286 | # @formatter:on |
| 287 | |
| 288 | def write_uint(self, v): |
| 289 | # v看成无符号数时,与write_ulong的结果一致,即相当于write_ulong(v & 0xffff_ffff) |
| 290 | v &= 0xffff_ffff |
| 291 | if v < 0x80: # 0xxx xxxx |
| 292 | self.ensure_write(1) |
| 293 | wi = self.wi |
| 294 | self.wi = wi + 1 |
| 295 | self.buf[wi] = v |
| 296 | elif v < 0x4000: # 10xx xxxx +1B |
| 297 | self.ensure_write(2) |
| 298 | wi = self.wi |
| 299 | self.wi = wi + 2 |
| 300 | buf = self.buf |
| 301 | buf[wi] = (v >> 8) + 0x80 |
| 302 | buf[wi + 1] = v & 0xff |
| 303 | elif v < 0x20_0000: # 110x xxxx +2B |
| 304 | self.ensure_write(3) |
| 305 | wi = self.wi |
| 306 | self.wi = wi + 3 |
| 307 | buf = self.buf |
| 308 | buf[wi] = (v >> 16) + 0xc0 |
| 309 | buf[wi + 1] = (v >> 8) & 0xff |
| 310 | buf[wi + 2] = v & 0xff |
| 311 | elif v < 0x1000_0000: # 1110 xxxx +3B |
| 312 | self.ensure_write(4) |
| 313 | wi = self.wi |
| 314 | self.wi = wi + 4 |
| 315 | struct.pack_into(">I", self.buf, wi, v + 0xe000_0000) |
| 316 | else: # 1111 0000 +4B |
| 317 | self.ensure_write(5) |
| 318 | wi = self.wi |
| 319 | self.wi = wi + 5 |
| 320 | buf = self.buf |
| 321 | buf[wi] = 0xf0 |
| 322 | struct.pack_into(">I", self.buf, wi + 1, v) |
| 323 | |
| 324 | @staticmethod |
| 325 | def truncate_int(x): |