aboutsummaryrefslogtreecommitdiff
path: root/research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py
diff options
context:
space:
mode:
authorSigma-Ohio <crt@teleco.ch>2025-06-07 06:35:16 +0200
committerSigma-Ohio <crt@teleco.ch>2025-06-07 06:35:16 +0200
commit7ceba5a0f3cbeb6ab15bc7f99aec87741ef177ea (patch)
treefd7bcd69b477eb6cb641abafb0b686204aede3c9 /research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py
parent9413cc24ab623f7d7959f18310262eb3b792ff9d (diff)
ich committe mit mienen besten
Diffstat (limited to 'research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py')
-rw-r--r--research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py b/research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py
new file mode 100644
index 0000000..3760727
--- /dev/null
+++ b/research/sample-data/ip-butt-big-extract/testers/checksum_analyzer.py
@@ -0,0 +1,34 @@
+#!/usr/bin/env python3
+import sys
+
+
+def compute_checksum(data: bytes) -> int:
+ # PSA checksum excludes first 4 bytes ("MEL\0")
+ relevant = data[4:]
+ total = sum(relevant)
+ folded = (total & 0xFF) + (total >> 8)
+ return (~folded) & 0xFF
+
+
+def interactive_mode():
+ print("PSA Checksum Generator (Melody 0x3001 packets)")
+ print("Paste the hex payload WITHOUT the checksum byte. Type 'exit' to quit.")
+ while True:
+ user_input = input("Payload> ").strip()
+ if user_input.lower() in ("exit", "quit"):
+ break
+ try:
+ data = bytes.fromhex(user_input)
+ checksum = compute_checksum(data)
+ completed = data + bytes([checksum])
+ print("Checksum: {:02X}".format(checksum))
+ print("Full Packet: {}".format(completed.hex()))
+ except ValueError:
+ print("Invalid hex input. Try again.")
+
+
+if __name__ == "__main__":
+ if len(sys.argv) == 2 and sys.argv[1] == "--batch":
+ print("Batch mode not implemented. Run without arguments for interactive mode.")
+ else:
+ interactive_mode()