Skip to content

Commit 9c8b212

Browse files
committed
bug fixed: add padding
1 parent 80c1094 commit 9c8b212

File tree

1 file changed

+26
-27
lines changed

1 file changed

+26
-27
lines changed

bindings/python/hako_binary/binary_writer.py

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,19 @@ def __init__(self):
1111
self.data = bytearray()
1212
self.offset_map = {}
1313

14-
def add(self, bytes_data, key=None):
14+
def add(self, bytes_data, expected_offset=None, key=None):
15+
if expected_offset is not None:
16+
current_size = len(self.data)
17+
if current_size < expected_offset:
18+
padding = bytearray(expected_offset - current_size)
19+
self.data.extend(padding)
20+
1521
offset = len(self.data)
1622
self.data.extend(bytes_data)
23+
1724
if key:
1825
self.offset_map[key] = offset
26+
1927
return offset
2028

2129
def to_array(self):
@@ -67,47 +75,38 @@ def get_binary(type, bin, elm_size):
6775
return bin
6876

6977
def binary_write_recursive(bw_container: BinaryWriterContainer, offmap, allocator, json_data, typename):
70-
#lines = offmap[typename]
7178
lines = offmap.get(typename)
7279
for key in json_data:
7380
line = offset_parser.select_by_name(lines, key)
7481
if line is None:
7582
continue
7683
type = offset_parser.member_type(line)
77-
if (offset_parser.is_primitive(line)):
78-
if (offset_parser.is_single(line)):
84+
off = offset_parser.member_off(line)
85+
if offset_parser.is_primitive(line):
86+
if offset_parser.is_single(line):
7987
bin = binary_io.typeTobin(type, json_data[key])
8088
bin = get_binary(type, bin, offset_parser.member_size(line))
81-
allocator.add(bin)
82-
elif (offset_parser.is_array(line)):
89+
# print(f"{type} {key} = {json_data[key]} : bin: {bin} size: {offset_parser.member_size(line)} bin_size: {len(bin)}")
90+
allocator.add(bin, expected_offset=off)
91+
elif offset_parser.is_array(line):
8392
elm_size = offset_parser.member_size(line)
8493
array_size = offset_parser.array_size(line)
85-
one_elm_size = int(elm_size / array_size)
86-
i = 0
87-
for elm in json_data[key]:
94+
one_elm_size = int(elm_size / array_size)
95+
for i, elm in enumerate(json_data[key]):
8896
bin = binary_io.typeTobin(type, elm)
8997
bin = get_binary(type, bin, one_elm_size)
90-
allocator.add(bin)
91-
i = i + 1
92-
else: #varray
93-
i = 0
94-
for elm in json_data[key]:
98+
allocator.add(bin, expected_offset=(off + i * one_elm_size))
99+
else: # varray
100+
for i, elm in enumerate(json_data[key]):
95101
bin = binary_io.typeTobin(type, elm)
96102
bin = get_binary(type, bin, offset_parser.member_size(line))
97-
bw_container.heap_allocator.add(bin)
98-
i = i + 1
103+
bw_container.heap_allocator.add(bin, expected_offset=(off + i * offset_parser.member_size(line)))
99104
else:
100-
if (offset_parser.is_single(line)):
105+
if offset_parser.is_single(line):
101106
binary_write_recursive(bw_container, offmap, allocator, json_data[key], type)
102-
elif (offset_parser.is_array(line)):
103-
i = 0
104-
for elm in json_data[key]:
107+
elif offset_parser.is_array(line):
108+
for i, elm in enumerate(json_data[key]):
105109
binary_write_recursive(bw_container, offmap, allocator, elm, type)
106-
i = i + 1
107-
else: #varray
108-
i = 0
109-
for elm in json_data[key]:
110+
else: # varray
111+
for i, elm in enumerate(json_data[key]):
110112
binary_write_recursive(bw_container, offmap, bw_container.heap_allocator, elm, type)
111-
i = i + 1
112-
113-

0 commit comments

Comments
 (0)