From 7ee5c1d728fc3b4d98683b05b8bcfe50da0567d0 Mon Sep 17 00:00:00 2001 From: NinjaCheetah <58050615+NinjaCheetah@users.noreply.github.com> Date: Thu, 23 Jan 2025 22:25:04 -0500 Subject: [PATCH] Added compress_lz77 docstrings, temporarily removed unfinished wiiload module --- src/libWiiPy/archive/lz77.py | 16 ++++----- src/libWiiPy/title/wiiload.py | 62 ----------------------------------- 2 files changed, 7 insertions(+), 71 deletions(-) delete mode 100644 src/libWiiPy/title/wiiload.py diff --git a/src/libWiiPy/archive/lz77.py b/src/libWiiPy/archive/lz77.py index 0e168b3..3ae4281 100644 --- a/src/libWiiPy/archive/lz77.py +++ b/src/libWiiPy/archive/lz77.py @@ -40,8 +40,7 @@ def _compress_search_matches(buffer: bytes, pos: int) -> (int, int): # up to that many bytes. max_len = min(_LZ_MAX_LENGTH, bytes_left) # Log the longest match we found and its offset. - biggest_match = 0 - biggest_match_pos = 0 + biggest_match, biggest_match_pos = 0, 0 # Search for matches. for i in range(_LZ_MIN_DISTANCE, max_dist + 1): num_matched = _compress_compare_bytes(buffer, pos - i, buffer, pos, max_len) @@ -67,28 +66,27 @@ def _compress_get_node_cost(length: int) -> int: def compress_lz77(data: bytes) -> bytes: """ + Compresses data using the Wii's LZ77 compression algorithm and returns the compressed result. Parameters ---------- - data + data: bytes + The data to compress. Returns ------- - + bytes + The LZ77-compressed data. """ nodes = [_LZNode() for _ in range(len(data))] # Iterate over the uncompressed data, starting from the end. pos = len(data) global _LZ_MAX_LENGTH, _LZ_MIN_LENGTH, _LZ_MIN_DISTANCE - iters = 0 while pos: - iters += 1 pos -= 1 node = nodes[pos] # Limit the maximum search length when we're near the end of the file. - max_search_len = _LZ_MAX_LENGTH - if max_search_len > (len(data) - pos): - max_search_len = len(data) - pos + max_search_len = min(_LZ_MAX_LENGTH, len(data) - pos) if max_search_len < _LZ_MIN_DISTANCE: max_search_len = 1 # Initialize as 1 for each, since that's all we could use if we weren't compressing. diff --git a/src/libWiiPy/title/wiiload.py b/src/libWiiPy/title/wiiload.py deleted file mode 100644 index eeb9d85..0000000 --- a/src/libWiiPy/title/wiiload.py +++ /dev/null @@ -1,62 +0,0 @@ -# "title/wiiload.py" from libWiiPy by NinjaCheetah & Contributors -# https://github.com/NinjaCheetah/libWiiPy -# -# This code is adapted from "wiiload.py", which can be found on the WiiBrew page for Wiiload. -# https://pastebin.com/4nWAkBpw -# -# See https://wiibrew.org/wiki/Wiiload for details about how Wiiload works - -import sys -import zlib -import socket -import struct - - -def send_bin_wiiload(target_ip: str, bin_data: bytes, name: str) -> None: - """ - Sends an ELF or DOL binary to The Homebrew Channel via Wiiload. This requires the IP address of the console you - want to send the binary to. - - Parameters - ---------- - target_ip: str - The IP address of the console to send the binary to. - bin_data: bytes - The data of the ELF or DOL to send. - name: str - The name of the application being sent. - """ - wii_ip = (target_ip, 4299) - - WIILOAD_VERSION_MAJOR=0 - WIILOAD_VERSION_MINOR=5 - - len_uncompressed = len(bin_data) - c_data = zlib.compress(bin_data, 6) - - chunk_size = 1024*128 - chunks = [c_data[i:i+chunk_size] for i in range(0, len(c_data), chunk_size)] - - args = [name] - args = "\x00".join(args) + "\x00" - - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - s.connect(wii_ip) - - s.send("HAXX") - s.send(struct.pack("B", WIILOAD_VERSION_MAJOR)) # one byte, unsigned - s.send(struct.pack("B", WIILOAD_VERSION_MINOR)) # one byte, unsigned - s.send(struct.pack(">H",len(args))) # bigendian, 2 bytes, unsigned - s.send(struct.pack(">L",len(c_data))) # bigendian, 4 bytes, unsigned - s.send(struct.pack(">L",len_uncompressed)) # bigendian, 4 bytes, unsigned - - print(len(chunks),"chunks to send") - for piece in chunks: - s.send(piece) - sys.stdout.write("."); sys.stdout.flush() - sys.stdout.write("\n") - - s.send(args) - - s.close() - print("done")