42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
"""Find IDFH interval period via auto-correlation of structural patterns."""
|
|
from __future__ import annotations
|
|
import sys
|
|
from pathlib import Path
|
|
from collections import Counter
|
|
|
|
REPO = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(REPO))
|
|
|
|
|
|
def main():
|
|
target = REPO / "tests/fixtures/THORDATA_example/THORDATA_example/UPMC Presby/UM13981/UM13981_20220805075441.IDFH"
|
|
buf = target.read_bytes()
|
|
body_start = 0xF96
|
|
body_end = 0x270C
|
|
body = buf[body_start:body_end]
|
|
print(f"body size: {len(body)} bytes (file {len(buf)} bytes)")
|
|
|
|
# For each candidate interval size, count how many bytes at fixed offsets within
|
|
# each interval are zero (consistent column-zero pattern indicates correct size).
|
|
print()
|
|
print("=== zero-column score by interval size (higher = more likely) ===")
|
|
best = []
|
|
for sz in range(16, 100):
|
|
n = len(body) // sz
|
|
if n < 30:
|
|
continue
|
|
# For each column position within an interval, count how many of n intervals have zero
|
|
score = 0
|
|
for col in range(sz):
|
|
zeros = sum(1 for i in range(n) if body[i*sz + col] == 0)
|
|
if zeros >= n * 0.9:
|
|
score += 1
|
|
best.append((score, sz, n))
|
|
best.sort(reverse=True)
|
|
for score, sz, n in best[:10]:
|
|
print(f" size={sz:3d} n_intervals={n} consistently-zero-cols={score}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|