mirror of
https://github.com/NinjaCheetah/libWiiPy.git
synced 2025-04-27 22:01:01 -04:00
Added compress_lz77 docstrings, temporarily removed unfinished wiiload module
This commit is contained in:
parent
e9a110bb1e
commit
7ee5c1d728
@ -40,8 +40,7 @@ def _compress_search_matches(buffer: bytes, pos: int) -> (int, int):
|
|||||||
# up to that many bytes.
|
# up to that many bytes.
|
||||||
max_len = min(_LZ_MAX_LENGTH, bytes_left)
|
max_len = min(_LZ_MAX_LENGTH, bytes_left)
|
||||||
# Log the longest match we found and its offset.
|
# Log the longest match we found and its offset.
|
||||||
biggest_match = 0
|
biggest_match, biggest_match_pos = 0, 0
|
||||||
biggest_match_pos = 0
|
|
||||||
# Search for matches.
|
# Search for matches.
|
||||||
for i in range(_LZ_MIN_DISTANCE, max_dist + 1):
|
for i in range(_LZ_MIN_DISTANCE, max_dist + 1):
|
||||||
num_matched = _compress_compare_bytes(buffer, pos - i, buffer, pos, max_len)
|
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:
|
def compress_lz77(data: bytes) -> bytes:
|
||||||
"""
|
"""
|
||||||
|
Compresses data using the Wii's LZ77 compression algorithm and returns the compressed result.
|
||||||
|
|
||||||
Parameters
|
Parameters
|
||||||
----------
|
----------
|
||||||
data
|
data: bytes
|
||||||
|
The data to compress.
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
-------
|
-------
|
||||||
|
bytes
|
||||||
|
The LZ77-compressed data.
|
||||||
"""
|
"""
|
||||||
nodes = [_LZNode() for _ in range(len(data))]
|
nodes = [_LZNode() for _ in range(len(data))]
|
||||||
# Iterate over the uncompressed data, starting from the end.
|
# Iterate over the uncompressed data, starting from the end.
|
||||||
pos = len(data)
|
pos = len(data)
|
||||||
global _LZ_MAX_LENGTH, _LZ_MIN_LENGTH, _LZ_MIN_DISTANCE
|
global _LZ_MAX_LENGTH, _LZ_MIN_LENGTH, _LZ_MIN_DISTANCE
|
||||||
iters = 0
|
|
||||||
while pos:
|
while pos:
|
||||||
iters += 1
|
|
||||||
pos -= 1
|
pos -= 1
|
||||||
node = nodes[pos]
|
node = nodes[pos]
|
||||||
# Limit the maximum search length when we're near the end of the file.
|
# Limit the maximum search length when we're near the end of the file.
|
||||||
max_search_len = _LZ_MAX_LENGTH
|
max_search_len = min(_LZ_MAX_LENGTH, len(data) - pos)
|
||||||
if max_search_len > (len(data) - pos):
|
|
||||||
max_search_len = len(data) - pos
|
|
||||||
if max_search_len < _LZ_MIN_DISTANCE:
|
if max_search_len < _LZ_MIN_DISTANCE:
|
||||||
max_search_len = 1
|
max_search_len = 1
|
||||||
# Initialize as 1 for each, since that's all we could use if we weren't compressing.
|
# Initialize as 1 for each, since that's all we could use if we weren't compressing.
|
||||||
|
@ -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")
|
|
Loading…
x
Reference in New Issue
Block a user