Вы отфильтровали свой список вывода только по строкам, потому что вы включили тест if ...
в свое понимание списка:
[data.replace('\x00','') for data in list(datagram) if isinstance(data, str)]
# all entries in datagram, that are strings
Это эквивалентно:
new_datagram = []
for data in list(datagram):
if isinstance(data, str):
new_value = data.replace('\x00','')
new_datagram.append(new_value)
datagram = new_datagram
Вы хотите использовать условное выражение вместо:
new_datagram = []
for data in datagram:
new_value = data.replace('\x00','') if isinstance(data, str) else data
new_datagram.append(new_value)
datagram = new_datagram
или, как понимание списка:
datagram = [data.replace('\x00','') if isinstance(data, str) else data for data in datagram]
Я бы использовал здесь str.rstrip('\x00')
, поскольку нулевые байты, вероятно, используются только для заполнения длины:
datagram = [data.rstrip('\x00') if isinstance(data, str) else data for data in datagram]
и поскольку вы уже знаете формат, вам нужно применить его только к 4 элементам, которые являются строками:
datagram = [datagram[0]] + [data.rstrip('\x00') for data in datagram[1:]]