| 834 | return bn |
| 835 | |
| 836 | def write_string(self, s): |
| 837 | bn = ByteBuffer.utf8_size(s) |
| 838 | if bn <= 0: |
| 839 | self.write_byte(0) |
| 840 | return |
| 841 | self.write_uint(bn) |
| 842 | self.ensure_write(bn) |
| 843 | buf = self.buf |
| 844 | wi = self.wi |
| 845 | if bn == len(s): |
| 846 | for c in s: |
| 847 | buf[wi] = ord(c) |
| 848 | wi += 1 |
| 849 | else: |
| 850 | for c in s: |
| 851 | v = ord(c) |
| 852 | if v < 0x80: |
| 853 | buf[wi] = v |
| 854 | wi += 1 |
| 855 | elif v < 0x800: |
| 856 | buf[wi] = 0xc0 + (v >> 6) |
| 857 | buf[wi + 1] = 0x80 + (v & 0x3f) |
| 858 | wi += 2 |
| 859 | elif v < 0x10000: |
| 860 | buf[wi] = 0xe0 + (v >> 12) |
| 861 | buf[wi + 1] = 0x80 + ((v >> 6) & 0x3f) |
| 862 | buf[wi + 2] = 0x80 + (v & 0x3f) |
| 863 | wi += 3 |
| 864 | else: |
| 865 | buf[wi] = 0xf0 + (v >> 18) |
| 866 | buf[wi + 1] = 0x80 + ((v >> 12) & 0x3f) |
| 867 | buf[wi + 2] = 0x80 + ((v >> 6) & 0x3f) |
| 868 | buf[wi + 3] = 0x80 + (v & 0x3f) |
| 869 | wi += 4 |
| 870 | self.wi = wi |
| 871 | |
| 872 | def read_string(self): |
| 873 | n = self.read_uint() |