Skip to content

Commit

Permalink
Remove unnecessary special handling of large fields
Browse files Browse the repository at this point in the history
Ref. #531
  • Loading branch information
Alexander Senier authored and senier committed Jan 4, 2021
1 parent bfd915c commit 84f7b83
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 19 deletions.
24 changes: 5 additions & 19 deletions rflx/pyrflx/typevalue.py
Original file line number Diff line number Diff line change
Expand Up @@ -709,25 +709,11 @@ def set_field_without_size(field_name: str, field: MessageValue.Field) -> Tuple[
def set_field_with_size(field_name: str, field_size: int) -> Tuple[int, int]:
assert isinstance(value, Bitstring)
last_pos_in_bitstr = current_pos_in_bitstring = get_current_pos_in_bitstr(field_name)
if field_size < 8 or field_size % 8 == 0:
self.set(
field_name,
value[current_pos_in_bitstring : current_pos_in_bitstring + field_size],
)
current_pos_in_bitstring += field_size
else:
bytes_used_for_field = field_size // 8 + 1
first_pos = current_pos_in_bitstring
field_bits = Bitstring()

for _ in range(bytes_used_for_field - 1):
field_bits += value[current_pos_in_bitstring : current_pos_in_bitstring + 8]
current_pos_in_bitstring += 8

k = field_size // bytes_used_for_field + 1
field_bits += value[current_pos_in_bitstring + 8 - k : first_pos + field_size]
current_pos_in_bitstring = first_pos + field_size
self.set(field_name, field_bits)
self.set(
field_name,
value[current_pos_in_bitstring : current_pos_in_bitstring + field_size],
)
current_pos_in_bitstring += field_size
return last_pos_in_bitstr, current_pos_in_bitstring

while current_field_name != FINAL.name:
Expand Down
12 changes: 12 additions & 0 deletions tests/data/specs/unaligned_field.rflx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package Unaligned_Field is

type T1 is mod 2**7;
type T2 is mod 2**18;

type M1 is
message
F1 : T1;
F2 : T1;
F3 : T2;
end message;
end Unaligned_Field;
18 changes: 18 additions & 0 deletions tests/unit/pyrflx_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1077,3 +1077,21 @@ def msg_checksum(_: bytes, **__: object) -> int:
tlv_message = message.get("Payload")
assert isinstance(tlv_message, MessageValue)
assert tlv_message.valid_message


@pytest.mark.parametrize(
"data, f1, f2, f3",
[
(b"\x00\x00\x00\x00", 0, 0, 0),
(b"\x11\x11\x11\x11", 0x8, 0x44, 0x11111),
(b"\x11\x22\x33\x44", 0x8, 0x48, 0x23344),
(b"\xff\xff\xff\xff", 0x7F, 0x7F, 0x3FFFF),
],
)
def test_unaligned_field_serialization(data: bytes, f1: int, f2: int, f3: int) -> None:
msg = PyRFLX.from_specs([f"{SPEC_DIR}/unaligned_field.rflx"])["Unaligned_Field"]["M1"]
msg.parse(data)
assert msg.get("F1") == f1
assert msg.get("F2") == f2
assert msg.get("F3") == f3
assert data == msg.bytestring
Empty file added tools/__init__.py
Empty file.

0 comments on commit 84f7b83

Please sign in to comment.