Find the raw bitstring from a captured Flipper RAW .sub file.
April 17, 2022 ยท View on GitHub
#!/usr/bin/env python
Find the raw bitstring from a captured Flipper RAW .sub file.
Must provide the bitlength in ms, and the allowable error which can be tolerated.
import re import sys import math
filename = sys.argv[1]
bitlen = 400 allowable_error = 60 minseg = bitlen - allowable_error
def normalize(seg): aseg = abs(seg) if aseg < minseg: return 'x' n = aseg // bitlen * bitlen if abs(aseg - n) <= allowable_error: return int(math.copysign(n, seg)) n += bitlen if abs(aseg - n) <= allowable_error: return int(math.copysign(n, seg)) return 'x'
segs = [] with open(filename, 'r') as f: for line in f: m = re.match(r'RAW_Data:\s*([-0-9 ]+)\s*$', line) if m: segs.extend([normalize(int(seg)) for seg in m[1].split(r' ')])
full = [] for seg in segs: if seg == 'x': full.append(seg) elif seg > 0: full.extend('1' * (seg // bitlen)) elif seg < 0: full.extend('0' * (-seg // bitlen)) full = ''.join(full)
print('Full bitstring:') print(full)
def longest_repeated_contiguous_substring(s): return max(re.findall(r'(.+)\1', s), key=len)
lrs = longest_repeated_contiguous_substring(full)
def shortest_repeat(s): while m := re.fullmatch(r'(.+)\1', s): s = m[1] return s
print('Shortest repeating contiguous substring:') print(shortest_repeat(lrs))