fix: 空渠道检测改用JSONObject.has + 移除gitignore误排除manifest
This commit is contained in:
129
fix_png.py
Normal file
129
fix_png.py
Normal file
@@ -0,0 +1,129 @@
|
||||
import sys
|
||||
import io
|
||||
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
||||
|
||||
with open(r"D:\Yuzu-GCA\screen.png", 'rb') as f:
|
||||
data = f.read()
|
||||
|
||||
# The file is UTF-16 LE encoded with some corruption.
|
||||
# Let's fix the known issues:
|
||||
|
||||
# 1. Replace the corrupted first char (U+5852 from bytes 52 58)
|
||||
# with correct U+0089 (89 00) + U+0050 (50 00)
|
||||
# But wait - in UTF-16 LE, each char takes 2 bytes.
|
||||
# We need to replace 2 bytes (52 58) with 4 bytes (89 00 50 00)
|
||||
|
||||
# Actually, let's approach differently:
|
||||
# Convert the whole thing from UTF-16 LE to raw bytes,
|
||||
# but fix the known corruptions.
|
||||
|
||||
# Step 1: parse as UTF-16 LE (skip BOM)
|
||||
raw = data[2:]
|
||||
# Each 2 bytes is one UTF-16 LE char
|
||||
chars = []
|
||||
for i in range(0, len(raw), 2):
|
||||
if i + 1 < len(raw):
|
||||
ch = raw[i] | (raw[i+1] << 8)
|
||||
chars.append(ch)
|
||||
|
||||
print(f"Total chars: {len(chars)}")
|
||||
|
||||
# Step 2: Fix corruptions in the char array
|
||||
# Char 0: U+5852 -> should be U+0089 (first PNG byte)
|
||||
# But U+0089 is one char, and we also need U+0050 for 'P'
|
||||
# So we need to insert a char
|
||||
|
||||
# The corruption pattern:
|
||||
# - Char 0 (U+5852) replaces two chars: U+0089 and U+0050
|
||||
# - Char 6 (U+000D) should be U+000A
|
||||
# - Char 7 (U+000A) is extra, should be removed
|
||||
# - Char 12 (U+000A) is extra, should be removed
|
||||
|
||||
# Let's verify by looking at what we expect:
|
||||
# Expected chars for correct PNG:
|
||||
# [0]=0x0089, [1]=0x0050('P'), [2]=0x004E('N'), [3]=0x0047('G'),
|
||||
# [4]=0x000D, [5]=0x000A, [6]=0x001A, [7]=0x000A (signature end)
|
||||
# [8]=0x0000, [9]=0x0000, [10]=0x0000, [11]=0x000D (IHDR length=13)
|
||||
# [12]=0x0049('I'), [13]=0x0048('H'), [14]=0x0044('D'), [15]=0x0052('R')
|
||||
|
||||
# Actual chars:
|
||||
# [0]=0x5852, [1]=0x004E, [2]=0x0047, [3]=0x000D, [4]=0x000A,
|
||||
# [5]=0x001A, [6]=0x000D, [7]=0x000A, [8]=0x0000, [9]=0x0000,
|
||||
# [10]=0x0000, [11]=0x000D, [12]=0x000A, [13]=0x0049, [14]=0x0048, ...
|
||||
|
||||
# Fix:
|
||||
# Replace char 0 (U+5852) with U+0089
|
||||
# Insert U+0050 at position 1
|
||||
# Change char 6 from 0x0D to 0x0A
|
||||
# Delete char 7 (extra 0x0A)
|
||||
# Delete char 12 (extra 0x0A) - wait, this is after IHDR length
|
||||
|
||||
fixed_chars = []
|
||||
# Fix char 0: split U+5852 -> U+0089, U+0050
|
||||
fixed_chars.append(0x0089) # PNG first byte
|
||||
fixed_chars.append(0x0050) # 'P'
|
||||
|
||||
# Copy chars 1-5 normally (but adjust indices)
|
||||
# Original char 1 (U+004E='N') -> fixed index 2
|
||||
# Original char 2 (U+0047='G') -> fixed index 3
|
||||
# Original char 3 (U+000D) -> fixed index 4
|
||||
# Original char 4 (U+000A) -> fixed index 5
|
||||
# Original char 5 (U+001A) -> fixed index 6
|
||||
fixed_chars.append(chars[1]) # 'N'
|
||||
fixed_chars.append(chars[2]) # 'G'
|
||||
fixed_chars.append(chars[3]) # '\r'
|
||||
fixed_chars.append(chars[4]) # '\n'
|
||||
fixed_chars.append(chars[5]) # '\x1a'
|
||||
|
||||
# Fix char 6: change from 0x0D to 0x0A
|
||||
fixed_chars.append(0x000A) # Should be '\n' instead of '\r'
|
||||
|
||||
# Skip char 7 (extra 0x0A) - don't add it
|
||||
|
||||
# Add chars 8-11 (IHDR length = 0x0000000D)
|
||||
fixed_chars.append(chars[8]) # 0x0000
|
||||
fixed_chars.append(chars[9]) # 0x0000
|
||||
fixed_chars.append(chars[10]) # 0x0000
|
||||
fixed_chars.append(chars[11]) # 0x000D
|
||||
|
||||
# Skip char 12 (extra 0x0A) - don't add it
|
||||
|
||||
# Add the rest from char 13 onwards
|
||||
for i in range(13, len(chars)):
|
||||
fixed_chars.append(chars[i])
|
||||
|
||||
print(f"Fixed chars: {len(fixed_chars)}")
|
||||
|
||||
# Step 3: Convert fixed chars back to UTF-16 LE bytes
|
||||
fixed_bytes = bytearray()
|
||||
for ch in fixed_chars:
|
||||
fixed_bytes.append(ch & 0xFF) # low byte
|
||||
fixed_bytes.append((ch >> 8) & 0xFF) # high byte
|
||||
|
||||
print(f"Fixed bytes: {len(fixed_bytes)}")
|
||||
|
||||
# Step 4: Extract original PNG bytes (every other byte, starting from first)
|
||||
# In UTF-16 LE, for ASCII chars (< 0x80), the low byte is the char and high byte is 00
|
||||
# But for non-ASCII chars like U+0089, the low byte is 0x89 and high byte is 0x00
|
||||
# So we take the low byte of each char
|
||||
png_bytes = bytearray()
|
||||
for ch in fixed_chars:
|
||||
png_bytes.append(ch & 0xFF)
|
||||
|
||||
print(f"PNG bytes: {len(png_bytes)}")
|
||||
print(f"First 32 PNG bytes: {' '.join(f'{b:02X}' for b in png_bytes[:32])}")
|
||||
|
||||
# Check PNG signature
|
||||
if png_bytes[:8] == b'\x89PNG\r\n\x1a\n':
|
||||
print("✓ Valid PNG signature!")
|
||||
with open(r"D:\Yuzu-GCA\screen_fixed.png", 'wb') as f:
|
||||
f.write(png_bytes)
|
||||
print("Saved screen_fixed.png")
|
||||
else:
|
||||
print(f"✗ Invalid signature: {' '.join(f'{b:02X}' for b in png_bytes[:8])}")
|
||||
# Try to see if we can find where it goes wrong
|
||||
expected = b'\x89PNG\r\n\x1a\n'
|
||||
for i in range(8):
|
||||
if png_bytes[i] != expected[i]:
|
||||
print(f" Mismatch at byte {i}: got {png_bytes[i]:02X}, expected {expected[i]:02X}")
|
||||
Reference in New Issue
Block a user