Skip to content

Commit 01d63dd

Browse files
binary: utf16 decode + tests
1 parent b287bd0 commit 01d63dd

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

‎tests/test_binary_vdf.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,8 @@ def test_vbkv_loads_invalid_checksum(self):
123123
with self.assertRaises(ValueError):
124124
vdf.vbkv_loads(b'VBKV\x01\x02\x03\x04\x00a\x00\x0b\x0b')
125125

126+
def test_loads_utf8_invalmid(self):
127+
self.assertEqual({'aaa': b'bb\xef\xbf\xbdbb'.decode('utf-8')}, vdf.binary_loads(b'\x01aaa\x00bb\xffbb\x00\x08'))
128+
129+
def test_loads_utf16(self):
130+
self.assertEqual({'aaa': b'b\x00b\x00\xff\xffb\x00b\x00'.decode('utf-16le')}, vdf.binary_loads(b'\x05aaa\x00b\x00b\x00\xff\xffb\x00b\x00\x00\x00\x08'))

‎vdf/__init__.py‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,18 @@ def binary_loads(s, mapper=dict, merge_duplicate_keys=True, alt_format=False):
295295
float32 = struct.Struct('<f')
296296

297297
def read_string(s, idx, wide=False):
298-
end = s.find(b'\x00\x00' if wide else b'\x00', idx)
298+
if wide:
299+
end = s.find(b'\x00\x00', idx)
300+
if (end - idx) % 2 != 0:
301+
end += 1
302+
else:
303+
end = s.find(b'\x00', idx)
304+
299305
if end == -1:
300306
raise SyntaxError("Unterminated cstring, index: %d" % idx)
301307
result = s[idx:end]
302308
if wide:
303-
result = result.decode('utf-16', 'replace')
309+
result = result.decode('utf-16')
304310
elif bytes is not str:
305311
result = result.decode('utf-8', 'replace')
306312
else:

0 commit comments

Comments
 (0)