-
-
Save jinschoi/40a470e432c6ac244be8159145454b5c to your computer and use it in GitHub Desktop.
| #!/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)) |
I needed to strip() the output from match()
"I needed to strip() the output from match()"
What does that mean?
I am getting
Exception has occurred: ValueError
invalid literal for int() with base 10: ''
File "D:\Disk Google\Flipper\bitstream-from-sub.py", line 33, in
segs.extend([normalize(int(seg)) for seg in m[1].split(r' ')])
File "D:\Disk Google\Flipper\bitstream-from-sub.py", line 33, in
segs.extend([normalize(int(seg)) for seg in m[1].split(r' ')])
I don't have access to the change I made but I added strip() to remove the extra line return. I think I added it on line 33. But I got the same error as you before I made the change.
@warcharlie Try my fork and see if it works: https://gist.github.com/atomical/4fd04136aaaf258e2f000769e5cbb375
@warcharlie Try my fork and see if it works: https://gist.github.com/atomical/4fd04136aaaf258e2f000769e5cbb375
Hello, thank you, I have figured it out.
Sorry, but I'm pretty new to python. How do I run this script? Thank you
I'm getting an error: