8000 BlfReader: Fix CAN_FD_MESSAGE_64 data padding (#1906) · hardbyte/python-can@b323e77 · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit b323e77

Browse files
authored
BlfReader: Fix CAN_FD_MESSAGE_64 data padding (#1906)
* add padding to CAN_FD_MESSAGE_64 data * set timezone to utc --------- Co-authored-by: zariiii9003 <zariiii9003@users.noreply.github.com>
1 parent 5526e32 commit b323e77

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

can/io/blf.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def timestamp_to_systemtime(timestamp: float) -> TSystemTime:
103103
if timestamp is None or timestamp < 631152000:
104104
# Probably not a Unix timestamp
105105
return 0, 0, 0, 0, 0, 0, 0, 0
106-
t = datetime.datetime.fromtimestamp(round(timestamp, 3))
106+
t = datetime.datetime.fromtimestamp(round(timestamp, 3), tz=datetime.timezone.utc)
107107
return (
108108
t.year,
109109
t.month,
@@ -126,6 +126,7 @@ def systemtime_to_timestamp(systemtime: TSystemTime) -> float:
126126
systemtime[5],
127127
systemtime[6],
128128
systemtime[7] * 1000,
129+
tzinfo=datetime.timezone.utc,
129130
)
130131
return t.timestamp()
131132
except ValueError:
@@ -239,7 +240,7 @@ def _parse_data(self, data):
239240
raise BLFParseError("Could not find next object") from None
240241
header = unpack_obj_header_base(data, pos)
241242
# print(header)
242-
signature, _, header_version, obj_size, obj_type = header
243+
signature, header_size, header_version, obj_size, obj_type = header
243244
if signature != b"LOBJ":
244245
raise BLFParseError()
245246

@@ -334,10 +335,20 @@ def _parse_data(self, data):
334335
_,
335336
_,
336337
direction,
337-
_,
338+
ext_data_offset,
338339
_,
339340
) = unpack_can_fd_64_msg(data, pos)
340-
pos += can_fd_64_msg_size
341+
342+
# :issue:`1905`: `valid_bytes` can be higher than the actually available data.
343+
# Add zero-byte padding to mimic behavior of CANoe and binlog.dll.
344+
data_field_length = min(
345+
valid_bytes,
346+
(ext_data_offset or obj_size) - header_size - can_fd_64_msg_size,
347+
)
348+
msg_data_offset = pos + can_fd_64_msg_size
349+
msg_data = data[msg_data_offset : msg_data_offset + data_field_length]
350+
msg_data = msg_data.ljust(valid_bytes, b"\x00")
351+
341352
yield Message(
342353
timestamp=timestamp,
343354
arbitration_id=can_id & 0x1FFFFFFF,
@@ -348,7 +359,7 @@ def _parse_data(self, data):
348359
bitrate_switch=bool(fd_flags & 0x2000),
349360
error_state_indicator=bool(fd_flags & 0x4000),
350361
dlc=dlc2len(dlc),
351-
data=data[pos : pos + valid_bytes],
362+
data=msg_data,
352363
channel=channel - 1,
353364
)
354365

test/data/issue_1905.blf

524 Bytes
Binary file not shown.

test/logformats_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,30 @@ def test_timestamp_to_systemt E888 ime(self):
789789
places=3,
790790
)
791791

792+
def test_issue_1905(self):
793+
expected = can.Message(
794+
timestamp=1735654183.491113,
795+
channel=6,
796+
arbitration_id=0x6A9,
797+
is_extended_id=False,
798+
is_fd=True,
799+
bitrate_switch=True,
800+
error_state_indicator=False,
801+
dlc=64,
802+
data=bytearray(
803+
b"\xff\xff\xff\xff\xff\xff\xff\xff"
804+
b"\xff\xff\xff\xff\xff\xff\xff\xff"
805+
b"\xff\xff\xff\xff\xff\xff\xff\xff"
806+
b"\xff\xff\xff\xff\xff\xff\xff\xff"
807+
b"\xff\xff\xff\xff\xff\xff\xff\xff"
808+
b"\xff\xff\xff\xff\xff\xff\xff\xff"
809+
b"\x00\x00\x00\x00\x00\x00\x00\x00"
810+
b"\x00\x00\x00\x00\x00\x00\x00\x00"
811+
),
812+
)
813+
msgs = self._read_log_file("issue_1905.blf")
814+
self.assertMessageEqual(expected, msgs[0])
815+
792816

793817
class TestCanutilsFileFormat(ReaderWriterTest):
794818
"""Tests can.CanutilsLogWriter and can.CanutilsLogReader"""

0 commit comments

Comments
 (0)
0