import re
import struct
def compile_s7_format(fmt):
s7_fmt = ">"
current_size = 0
for match in re.finditer(r"(\d*)([a-zA-Z])", fmt):
count_str, dtype = match.groups()
count = int(count_str) if count_str else 1
# 1. Sonderfall: Füllbytes (x) direkt unverändert anhängen
if dtype == "x":
s7_fmt += f"{count}x"
current_size += count
continue
# 2. Alignment berechnen
ssize = struct.calcsize(f">{dtype}")
if (remainder := current_size % ssize) != 0:
padding_bytes = ssize - remainder
s7_fmt += f"{padding_bytes}x"
current_size += padding_bytes
# 3. Den originalen Typ formschlüssig anhängen
# Wichtig: Nutzen Sie das originale count_str, um 'f' statt '1f' zu schreiben
s7_fmt += f"{count_str}{dtype}"
current_size += ssize * count
return s7_fmt
Comments