2026-09-30 16:01:13 +00:00
---
layout: post
title: 如何制作一个“完整”的博客压缩包?
tags: [压缩包, Quine, LZMA2, 7-Zip]
---
让AI做出真正的“完整”将不再是难事……<!--more-->
# 起因
在上次[用AI制作了各种东西 ](/2026/09/01/vibe-coding2.html )之后,我已经完全理解了AI确实是无所不能的。既然如此,那就让它帮我解决曾经未能解决的事情吧?
去年,我为了让下载全站压缩包的按钮不断链,让这个压缩包也包含它本身而研究了[ZIP Quine ](/2025/09/01/quine.html ),但限于DEFLATE的回溯窗口大小没能做到……但那是人做的东西,人还是太弱小了,现在换AI来试试,也许一切将变得不一样?
# 制作基于LZMA2的博客压缩包
首先,我把[Ruben Van Mello ](https://github.com/ruvmello )写的那篇论文《[A Generator for Recursive Zip Files ](https://www.mdpi.com/2076-3417/14/21/9797 )》以及生成器[zip-quine-generator ](https://github.com/ruvmello/zip-quine-generator )发给了AI,问它这个限制是不是真的,是不是真的无法创造出超过32KiB的ZIP Quine?没过多久它分析完了,告诉我确实存在这样的问题,但并不是无法解决的,最简单的办法就是换个回溯窗口更大的压缩算法。我看了一下它给我列出的几个算法,看起来LZMA2和zstd比较符合要求。不过zstd感觉不是很知名,一般的解压软件应该处理不了,所以我就选择让它基于LZMA2来制作了。
不过LZMA2只是算法,还得选个容器,考虑到7z算是最出名,而且LZMA2本来就是7-Zip的作者开发的,所以就直接让它做7z版本的了。另外因为[Nate Choe ](https://github.com/NateChoe1 )做了通过扩展欧几里得求逆元来计算CRC32的[PR ](https://github.com/ruvmello/zip-quine-generator/pull/3 ),所以我也告诉它要用这种方法在多项式时间内解出CRC32的值,而不是爆破。就这样AI花了两个小时左右成功把代码写出来了,效果非常完美,另外它还偷懒地将计算CRC32的算法改成了高斯消元法😆,因为7z格式有3个相互影响的CRC32值,用扩展欧几里得会更复杂一点,不过对7z来说不写入文件的CRC32也不影响,只是会不校验罢了,至少它还是按我要求做了……但其实这个问题也并不是完全不能用扩展欧几里得算法,后来我又强烈要求了一下,AI还是给我写出来了。以下是代码片段,有兴趣的人可以参考一下(不过这个看起来写的就是很复杂,所以我自己只用了高斯消元法):
``` python
RU_POLY = 0x104C11DB7 # x^32+x^26+x^23+...+1(含 x^32 首项)
def _find_probe ( p ) :
ret = 0
for i in range ( 64 ) :
if ( 1 << i ) & p :
ret = i
return ret
def _mul_raw ( p1 , p2 ) :
""" 多项式乘法(无模)。 """
ret = 0
probe = _find_probe ( p1 )
for i in range ( 64 ) :
if p2 & ( 1 << i ) :
assert probe + i < 64 , " 多项式乘法溢出 "
ret ^ = p1 << i
return ret
def _poly_divmod ( dividend , divisor ) :
""" 多项式长除法,返回 (商, 余)。 """
probe = _find_probe ( divisor )
probe_bit = 1 << probe
quot = 0
rem = dividend
for i in range ( 63 - probe , - 1 , - 1 ) :
if rem & ( probe_bit << i ) :
quot | = 1 << i
rem ^ = divisor << i
return quot , rem
def _mul ( p1 , p2 , mod ) :
""" p1*p2 % mod。 """
return _poly_divmod ( _mul_raw ( p1 , p2 ) , mod ) [ 1 ]
def _xgcd ( p1 , p2 ) :
""" 扩展欧几里得:返回 (k1,k2,gcd),满足 p1*k1+p2*k2=gcd。 """
if _find_probe ( p1 ) < _find_probe ( p2 ) :
k1 , k2 , g = _xgcd ( p2 , p1 )
return k2 , k1 , g
if p2 == 0 :
return p1 , 0 , p1
q , r = _poly_divmod ( p1 , p2 )
c1 , c2 , g = _xgcd ( p2 , r )
return c2 , c1 ^ _mul_raw ( c2 , q ) , g
def _minv ( p , mod ) :
""" p 在环上的乘法逆元;不存在时返回 0。 """
k1 , _ , g = _xgcd ( p , mod )
if g != 1 :
return 0
return _poly_divmod ( k1 , mod ) [ 1 ]
def _bitrev32 ( x ) :
""" 32 位比特反转。CRC 的输出循环冗余(binascii 反射)↔ 本环(非反射)互为 bit-reverse。 """
return int ( format ( x & 0xFFFFFFFF , " 032b " ) [ : : - 1 ] , 2 )
def _ring_pow_x ( k ) :
""" 环内 x^k mod P( P=RU_POLY),二进制幂 O(log k)。变量列就是单个环幂。 """
res , base , mod , e = 1 , 2 , RU_POLY , k
while e :
if e & 1 :
res = _mul ( res , base , mod )
base = _mul ( base , base , mod )
e >> = 1
return res
def solve_crc_system ( files ) :
""" 解析解 CRC 定点系统
- 常数列 :对“变量清零”的数据做一次 binascii.crc32,再 bit-reverse 32 位
( binascii 反射 CRC 与本环非反射 CRC 互为 bit-reverse,见 _bitrev32)。
- 变量列 :单个环幂 x^(32 + 8*(len-pos-4)),二进制幂 O(log N) 一步算出;
同一变量出现在多处时按位异或累加。
各自 O(#rows) 次 CRC + 少量环幂即可建出整矩阵,Gauss 消元不变。
"""
n = len ( files )
mod = RU_POLY
matrix = [ [ 0 ] * ( n + 1 ) for _ in range ( n ) ]
for file in range ( n ) :
data = files [ file ] [ 0 ]
offsets = files [ file ] [ 1 ]
N = len ( data )
zero = bytearray ( data )
for pos in offsets : # 未知量占 4 字节,清零后求常数项
zero [ pos : pos + 4 ] = b " \x00 \x00 \x00 \x00 "
matrix [ file ] [ n ] = _bitrev32 ( crc32 ( bytes ( zero ) ) )
for pos , vid in offsets . items ( ) :
rest = N - pos - 4 # 变量被 4 字节(x^32)+ 其后字节(x^8/个)推到底
matrix [ file ] [ vid ] ^ = _ring_pow_x ( 32 + 8 * rest )
matrix [ file ] [ file ] ^ = 1
for sr in range ( n ) :
ex = sr
while ex < n and matrix [ ex ] [ sr ] == 0 :
ex + = 1
if ex == n :
raise RuntimeError ( " CRC 多项式系统奇异 @row %d " % sr )
if ex != sr :
matrix [ sr ] , matrix [ ex ] = matrix [ ex ] , matrix [ sr ]
inv = _minv ( matrix [ sr ] [ sr ] , mod )
for er in range ( sr + 1 , n ) :
mult = _mul ( inv , matrix [ er ] [ sr ] , mod )
for ec in range ( n + 1 ) :
matrix [ er ] [ ec ] ^ = _mul ( mult , matrix [ sr ] [ ec ] , mod )
res = [ 0 ] * n
for row in range ( n - 1 , - 1 , - 1 ) :
v = matrix [ row ] [ n ]
for col in range ( row + 1 , n ) :
v ^ = _mul ( res [ col ] , matrix [ row ] [ col ] , mod )
res [ row ] = _mul ( v , _minv ( matrix [ row ] [ row ] , mod ) , mod )
return [ _impl_val ( res [ i ] ) for i in range ( n ) ]
def _impl_val ( math_val ) :
imp = 0
for bit in range ( 32 ) :
if math_val & ( 1 << bit ) :
imp | = 1 << ( 31 - bit )
return imp
class BlogQuine :
def solve_crc ( self , F , lay , seed ) :
T , h , d = lay [ " T " ] , lay [ " h " ] , lay [ " d " ]
k , n_sub , crc_base = lay [ " k " ] , lay [ " n_sub " ] , lay [ " crc_base " ]
hoff = lay [ " total " ] - h
vout_f = lay [ " total " ] - 2 * T
hcopy = vout_f + ( T - h )
# 已知 CRC: seed + 各文件(quine 的是未知量 D)
known = [ crc32 ( seed ) ] + [ crc32 ( data ) for _ , data in self . files ]
assert len ( known ) == n_sub - 1
for i , e in enumerate ( known ) :
struct . pack_into ( " <I " , F , hoff + crc_base + 4 * i , e )
struct . pack_into ( " <I " , F , hcopy + crc_base + 4 * i , e )
# 未知量 D N S: D=整个文件、N=头部 F[hoff:hoff+h]、S=签名 F[12:32]
dpos = crc_base + 4 * ( n_sub - 1 )
ncopy = 32 + 3 * k + d # C1k 载荷里 F[0:35) 副本起点
groups = [ [ hoff + dpos , hcopy + dpos ] , # D 出现两处
[ 28 , ncopy + 28 ] , # N
[ 8 , ncopy + 8 ] ] # S
# 构造 3 个“文件”喂给解析解系统:
# 文件0 = 整个 F,三个未知量各自出现在 groups 两处
# 文件1 = 头部块,只有 D 出现在相对 dpos(另一处 hcopy+dpos 在头外)
# 文件2 = 签名块,只有 N 出现在相对 16(28-12)
whole = bytes ( F )
hdr = bytes ( F [ hoff : hoff + h ] )
sig = bytes ( F [ 12 : 32 ] )
f0_off = { hoff + dpos : 0 , hcopy + dpos : 0 ,
28 : 1 , ncopy + 28 : 1 ,
8 : 2 , ncopy + 8 : 2 }
f1_off = { dpos : 0 }
f2_off = { 28 - 12 : 1 }
vals = solve_crc_system ( [ ( whole , f0_off ) , ( hdr , f1_off ) , ( sig , f2_off ) ] )
for g in range ( 3 ) :
for p in groups [ g ] :
F [ p : p + 4 ] = struct . pack ( " <I " , vals [ g ] )
real = ( crc32 ( F ) , crc32 ( F [ hoff : hoff + h ] ) , crc32 ( F [ 12 : 32 ] ) )
assert real == tuple ( vals ) , " CRC 定点失败: %s != %s " % ( real , vals )
return vals
```
于是我第一时间就把原来的TGZ压缩命令换掉,换成了AI给我写的[blogquine.py ](https://github.com/Mabbs/mabbs.github.io/blob/master/_tools/blogquine.py ),现在就可以通过[这里 ](https://mayx.eu.org/MayxBlog.7z )下载到“完整”包含我博客所有内容的压缩包了。
不过唯一的问题就是这样做出来的压缩包并没有压缩😂,相当于给做成了普通的归档了。当然我的博客本身倒是不大,没压缩也多不了多少空间,但相比于能做出“完整”的效果来说,这点浪费的空间也是小问题了。
2026-10-07 06:16:54 +00:00
## 基于博客压缩包的离线模式(2026.10.03更新)
既然现在的AI什么都能做了,那上次我因为技术不足仅仅只是用[Service Worker做了个代理 ](/2025/08/01/sw-proxy.html ),现在也可以升级成下载全站之后让全站离线的功能吧?不过之前做的压缩包并没有压缩,导致整个压缩包有接近20MiB的大小,后来我仔细想了一下我的需求,我只是想让下载全站压缩包的按钮不断链,并没有说解压后的文件一定就必须是它本身,所以我只要用相同的文件名再压缩一次应该就可以了,这样既能满足我的想法,又可以让其他人下载的时候不会花费太多的时间。
在我直接压缩之后,整个压缩包占用大概9MiB的空间,其实我已经很满意了,不过压之前是18MiB,也就是说压缩率是50%……虽然也不是不能接受,但我在想这是不是合理的结果呢?我让AI分析了一下50%的压缩率正不正常,它看了一眼之后告诉我文本部分的10MiB压缩完之后有1MiB,图片因为压不动所以直接占用了8MiB😅,这时候我才意识到原来我一直存着一堆占着大量空间的垃圾,而且还是用的PNG/JPG这种压缩率很低的格式……考虑到兼容性和压缩效果,我把占用比较大的图片转换为了WebP格式,最终整个压缩包就只占用了4MiB的空间,一口气又节省了50%的空间。
最后做完对压缩包的处理之后,我直接让AI给我基于那个压缩包制作离线模式,它轻轻松松就[做出来 ](https://mayx.eu.org/offline.html )了,最终使用的是[libarchive库 ](https://github.com/nika-begiashvili/libarchivejs ),在启用离线模式之后整个网站的速度简直就是0延迟,点击就能瞬间跳转,效果算是相当不错了。
## 受大佬启发制作了能压缩的7z Quine( 2026.10.05更新)
做完博客压缩包之后我突发奇想,虽然东西是AI做的,但也是在我的手中做出了世界上第一个LZMA2 Quine,那么如果我向全世界第一个制作ZIP Quine的人展示一下我的作品会怎么样呢?目前可以知道,世界上第一个制作ZIP Quine的人是[Erling Ellingsen ](https://infosec.exchange/@steike ),所以我向他发了个帖子[展示了一下 ](https://infosec.exchange/@mayx/117385801954308033 )。大佬不愧是大佬,一眼就能看出理论上能压缩的7z Quine是可以做出来的,对我来说,我是完全不知道7-Zip居然还支持链式编解码,能可以通过“double lzma2”的方式做到既可以自包含、又能真正被压缩的压缩包。既然大佬说理论上可以,那我自然是相信的,于是就让AI给我使劲折腾想办法把它做出来。在折腾了一晚上之后AI终于做出来了,真是强得可怕:
``` python
# ============================================================
# 双层 LZMA2 的 7z quine( "double lzma2")
#
# F = S32 ‖ P ‖ H, folder 的 coder 链 = [LZMA2(外层), LZMA2(内层)],
# 解码管线:P --外层--> I --内层--> U。
#
# I = Cseg ‖ LBseg ‖ Mseg ‖ 0x00
# Cseg : 真实 LZMA2 对 content 的压缩流(内容真正的压缩数据 C)
# LBseg: 内层 store 链,载荷 = seed(seed 内含一份 C 的参照副本)
# Mseg : 内层 match 链,输出 quine 区(= F 的逐字节副本)
# U = content ‖ seed ‖ F
#
# 外层把 I 再压一遍:Cseg 用 store 链原样承载;seed 里的 C 参照副本与 Cseg
# 逐字节相同,被外层的 rep0 回溯匹配消掉,于是成品里只剩一份压缩数据。
# quine 区回引 P 的字节时,源全在 seed 里(C 副本 / 头样本表 / 机械串)。
# ============================================================
def lzma_chunk ( tokens , out_pos ) :
""" 编一个 LZMA chunk( 0xC0: state+props reset,无 dict reset,无 end marker)。
match token 的编码字节只取决于 (dist,len,pos),与历史内容无关(不维护输出历史)。
解压长度用 21 位(控制字节低 5 位存高 5 位),故单 chunk 输出上限 2 MiB。 """
enc = LzmaEncoder ( )
enc . pos = out_pos
total = 0
for t in tokens :
if t [ 0 ] == " m " :
enc . match ( t [ 1 ] , t [ 2 ] )
total + = t [ 2 ]
else :
enc . rep_match ( t [ 1 ] )
total + = t [ 1 ]
data = enc . finish ( )
u = total - 1
c = len ( data ) - 1
assert 0 < = u < ( 1 << 21 ) and 0 < = c < 65536 , ( total , len ( data ) )
hdr = bytes ( [ 0xC0 | ( ( u >> 16 ) & 0x1F ) ] ) + ( u & 0xFFFF ) . to_bytes ( 2 , " big " ) + \
( c & 0xFFFF ) . to_bytes ( 2 , " big " ) + bytes ( [ PROPS_BYTE ] )
return hdr + data , total
LZ2_MAXU = 1 << 21 # LZMA2 单个 LZMA chunk 的解压上限
def lzma2_raw ( data , dict_size , preset = 6 ) :
""" FORMAT_RAW + LZMA2 压缩;去掉结尾 0x00 便于后面继续追加 chunk。 """
c = lzma . LZMACompressor (
format = lzma . FORMAT_RAW ,
filters = [ { " id " : lzma . FILTER_LZMA2 , " dict_size " : dict_size , " preset " : preset } ] )
out = c . compress ( data ) + c . flush ( )
assert out and out [ - 1 ] == 0x00 , " LZMA2 流应以 0x00 结尾 "
return out [ : - 1 ]
def split_len ( n , cap ) :
""" 按 cap 上限切分 n 字节。末片若为 1 字节则从前一片借 1(match 最短为 2)。 """
Ls , rem = [ ] , n
while rem > cap :
Ls . append ( cap )
rem - = cap
if rem == 1 and Ls :
Ls [ - 1 ] - = 1
rem = 2
Ls . append ( rem )
return Ls
class DoubleQuine ( BlogQuine ) :
""" 双层 LZMA2 版本:folder = [LZMA2(外层), LZMA2(内层)]。 """
def entries ( self ) :
""" U 的顺序是 内容文件… ‖ seed ‖ quine,条目顺序必须与之对应。 """
ent = [ { " name " : r , " dir " : isd } for r , isd in self . walk_entries ]
ent . append ( { " name " : self . seed_name , " dir " : False } )
ent . append ( { " name " : self . quine_name , " dir " : False } )
return ent
# ---------- 头部:双 coder + BindPair ----------
def build_header ( self , n , total , d , entries , sub_sizes , size_I ) :
n_sub = len ( sub_sizes )
N = len ( entries )
h = bytearray ( )
h + = b " \x01 \x04 " # kHeader, kMainStreamsInfo
h + = b " \x06 " + varint ( 0 ) + varint ( 1 ) + b " \x09 " + varint ( n ) + b " \x00 "
h + = b " \x07 " # kUnpackInfo
h + = b " \x0b " + varint ( 1 ) + b " \x00 " # kFolder: 1, local
h + = varint ( 2 ) # NumCoders = 2
h + = b " \x21 \x21 " + varint ( 1 ) + bytes ( [ self . dict_prop_out ] ) # coder0 = 外层
h + = b " \x21 \x21 " + varint ( 1 ) + bytes ( [ self . dict_prop_in ] ) # coder1 = 内层
h + = varint ( 1 ) + varint ( 0 ) # BindPair = (InIndex=1, OutIndex=0)
h + = b " \x0c " + varint ( size_I ) + varint ( d + total ) # 两个 coder 的输出大小
h + = b " \x00 "
h + = b " \x08 " # SubStreamsInfo
h + = b " \x0d " + varint ( n_sub )
h + = b " \x09 " + b " " . join ( varint ( s ) for s in sub_sizes [ : - 1 ] )
h + = b " \x0a " + b " \x01 "
crc_base = len ( h )
h + = b " \x00 " * ( 4 * n_sub )
h + = b " \x00 \x00 "
h + = b " \x05 " + varint ( N ) # FilesInfo
bits = bytearray ( ( N + 7 ) / / 8 )
for i , e in enumerate ( entries ) :
if e [ " dir " ] :
bits [ i / / 8 ] | = 1 << ( 7 - i % 8 )
h + = b " \x0e " + varint ( len ( bits ) ) + bytes ( bits )
mt = b " \x01 \x00 " + struct . pack ( " <Q " , self . mtime_ft ) * N
h + = b " \x14 " + varint ( len ( mt ) ) + mt
names = bytearray ( b " \x00 " )
for e in entries :
names + = e [ " name " ] . encode ( " utf-16-le " ) + b " \x00 \x00 "
h + = b " \x11 " + varint ( len ( names ) ) + bytes ( names )
attrs = b " " . join ( struct . pack ( " <I " , 0x10 if e [ " dir " ] else 0x20 )
for e in entries )
h + = b " \x15 " + varint ( 2 + len ( attrs ) ) + b " \x01 \x00 " + attrs
h + = b " \x00 \x00 "
return bytes ( h ) , crc_base
# ---------- 布局:三层坐标的不动点迭代 ----------
def layout ( self ) :
content = self . content
dc = len ( content )
dict_c = max ( 1 << 20 , 1 << max ( 20 , dc . bit_length ( ) ) )
C = lzma2_raw ( content , dict_c )
self . _C = C # 内容压缩只做一次,finalize 复用
lc = len ( C )
# 迭代变量:Y = plant 长度, H = 头部长度, M = Mseg 字节数
Y , H , M = 96 , 256 , 256
seen = set ( )
for _ in range ( 200 ) :
ds = lc + 32 + H + Y # seed = C副本‖S32‖H‖plant
d = dc + ds
Ls_LB = split_len ( ds , CHUNK )
lLB = 3 * len ( Ls_LB ) + ds
off_in = lc + lLB
M1 = M + 1 # Mseg ‖ 内层流终止符 0x00
Ls_M = split_len ( M1 , CHUNK )
Li = off_in + M1
self . dict_prop_out , _ = dict_prop_for ( max ( Li , 1 << 20 ) )
self . dict_prop_in , _ = dict_prop_for ( d + 32 + H + 8192 )
st = self . _build_streams ( C , lc , ds , d , Ls_LB , lLB , off_in , Ls_M ,
M1 , H )
if st is None :
Y + = 8
continue
mseg = self . _build_mseg ( st , d , lc , ds , H , M )
if mseg is None :
Y + = 8
continue
M_new = len ( mseg )
Y_new = len ( st [ " hdr_bytes " ] ) + len ( st [ " mech " ] ) + M_new + 2
total = st [ " n " ] + 32 + H
file_sizes = [ len ( x ) for _ , x in self . files ]
sub_sizes = file_sizes + [ ds ] + [ total ]
entries = self . entries ( )
hdr , crc_base = self . build_header ( st [ " n " ] , total , d , entries ,
sub_sizes , Li )
H_new = len ( hdr )
key = ( Y_new , H_new , M_new )
if key in seen : # 再次见到同一组值 = 已收敛
Y , H , M = Y_new , H_new , M_new
break
seen . add ( key )
Y , H , M = Y_new , H_new , M_new
else :
raise RuntimeError ( " double layout 不收敛 " )
return { " Y " : Y , " H " : H , " M " : M }
# ---------- 定稿:用收敛后的 (Y, H, M) 重算全部结构 ----------
def finalize ( self , Y , H , M ) :
content = self . content
dc = len ( content )
C = self . _C # layout 里已压缩过
lc = len ( C )
ds = lc + 32 + H + Y
d = dc + ds
Ls_LB = split_len ( ds , CHUNK )
lLB = 3 * len ( Ls_LB ) + ds
off_in = lc + lLB
M1 = M + 1
Ls_M = split_len ( M1 , CHUNK )
Li = off_in + M1
self . dict_prop_out , ds_out = dict_prop_for ( max ( Li , 1 << 20 ) )
self . dict_prop_in , ds_in = dict_prop_for ( d + 32 + H + 8192 )
st = self . _build_streams ( C , lc , ds , d , Ls_LB , lLB , off_in , Ls_M , M1 , H )
mseg = self . _build_mseg ( st , d , lc , ds , H , M )
assert len ( mseg ) == M , " Mseg %d != %d " % ( len ( mseg ) , M )
total = st [ " n " ] + 32 + H
file_sizes = [ len ( x ) for _ , x in self . files ]
sub_sizes = file_sizes + [ ds ] + [ total ]
entries = self . entries ( )
hdr , crc_base = self . build_header ( st [ " n " ] , total , d , entries ,
sub_sizes , Li )
assert len ( hdr ) == H , " header %d != %d " % ( len ( hdr ) , H )
plant = st [ " hdr_bytes " ] + bytes ( st [ " mech " ] ) + mseg + b " \x00 \x00 "
assert len ( plant ) == Y , " plant %d != %d " % ( len ( plant ) , Y )
return { " C " : C , " lc " : lc , " dc " : dc , " ds " : ds , " d " : d , " Li " : Li ,
" ochunks " : st [ " ochunks " ] , " hdr_tab " : st [ " hdr_tab " ] ,
" mseg " : mseg , " M " : M , " H " : H , " n " : st [ " n " ] , " total " : total ,
" header " : hdr , " crc_base " : crc_base , " plant " : plant ,
" dict_size_in " : ds_in , " dict_size_out " : ds_out ,
" n_sub " : len ( sub_sizes ) }
# ---------- 外层流 P 的构造 ----------
def _build_streams ( self , C , lc , ds , d , Ls_LB , lLB , off_in , Ls_M , M1 , H ) :
hdr_tab , hdr_idx = [ ] , { }
def hidx ( b ) :
assert len ( b ) == 3 and b [ 0 ] in ( 0x01 , 0x02 ) , b . hex ( )
if b not in hdr_idx :
hdr_idx [ b ] = len ( hdr_tab )
hdr_tab . append ( b )
return hdr_idx [ b ]
ochunks = [ ]
f , io = 32 , 0
mech = bytearray ( )
def put_lzma ( tokens , ioff ) :
blk , t = lzma_chunk ( tokens , ioff )
ochunks . append ( { " kind " : " lzma " , " foff " : f , " size " : len ( blk ) ,
" ioff " : ioff , " olen " : t , " bytes " : blk ,
" mech " : len ( mech ) } )
mech . extend ( blk )
return len ( blk ) , t
def put_store ( ioff , olen , hi , src ) :
ochunks . append ( { " kind " : " store " , " foff " : f , " size " : 3 + olen ,
" ioff " : ioff , " olen " : olen , " hdr " : hi , " src " : src } )
return 3 + olen
# 段 1: store 链承载 Cseg( I[0:lc] = C 的字节;源 = seed 的 C 参照副本)
Ls_C = split_len ( lc , CHUNK )
c_off = 0
for L in Ls_C :
f + = put_store ( io , L , hidx ( store_hdr ( L , first = ( c_off == 0 ) ) ) ,
( " seed " , c_off ) )
io + = L
c_off + = L
assert io == lc
# 段 2: LBseg( I[lc : lc+lLB])—— 内层 store 链,载荷 = seed
lb_off = lc
seed_off = 0
for j , L in enumerate ( Ls_LB ) :
lb_hdr = store_hdr ( L , first = False )
if j == 0 or L != CHUNK :
# 没有可回引的相同样本,用外层 store chunk 原样携带这 3 字节
f + = put_store ( lb_off , 3 , hidx ( store_hdr ( 3 , first = False ) ) ,
( " tab " , hidx ( lb_hdr ) ) )
io + = 3
else :
# 与 chunk0 的头逐字节相同,直接从 I[lc:lc+3] 复制
n , t = put_lzma ( [ ( " m " , lb_off - lc , 3 ) ] , lb_off )
assert t == 3
f + = n
io + = 3
# 载荷:C 参照副本区走 rep0 回溯匹配(去重发生处),其余走 store
pay = lb_off + 3
i = 0
while i < L :
if seed_off + i < lc :
a = min ( L - i , lc - ( seed_off + i ) , LZ2_MAXU )
dist = ( pay + i ) - ( seed_off + i )
n , t = put_lzma ( matches_for ( dist , a ) , pay + i )
assert t == a
f + = n
io + = a
i + = a
else :
a = min ( L - i , LZ2_MAXU )
f + = put_store ( pay + i , a , hidx ( store_hdr ( a , first = False ) ) ,
( " seed " , seed_off + i ) )
io + = a
i + = a
lb_off + = 3 + L
seed_off + = L
assert lb_off == lc + lLB and io == lc + lLB
# 段 3: store 链承载 Mseg ‖ 0x00( 0x00 是内层流的终止符)
m_off = 0
for L in Ls_M :
f + = put_store ( off_in + m_off , L ,
hidx ( store_hdr ( L , first = False ) ) , ( " mseg " , m_off ) )
io + = L
m_off + = L
# 外层流自己的终止符 0x00
ochunks . append ( { " kind " : " term " , " foff " : f , " size " : 1 , " ioff " : io ,
" olen " : 0 , " bytes " : b " \x00 " } )
f + = 1
return { " ochunks " : ochunks , " mech " : mech , " hdr_tab " : hdr_tab ,
" hdr_bytes " : b " " . join ( hdr_tab ) , " n " : f - 32 }
# ---------- 内层 Mseg:把 quine 区的每个 F 区段映射成 match 链 ----------
def _build_mseg ( self , st , d , lc , ds , H , M ) :
dc = d - ds
s_S32 = dc + lc # seed 里 S32 副本
s_H = dc + lc + 32 # seed 里 H 副本
s_tab = dc + lc + 32 + H # seed 里头样本表
s_mech = s_tab + len ( st [ " hdr_bytes " ] ) # seed 里机械串
s_mseg = s_mech + len ( st [ " mech " ] ) # seed 里 Mseg 副本
total = st [ " n " ] + 32 + H
hoff = 32 + st [ " n " ]
segs = [ ( 0 , 32 , s_S32 ) ] # F[0:32) 签名头
for c in st [ " ochunks " ] :
if c [ " kind " ] == " store " :
segs . append ( ( c [ " foff " ] , 3 , s_tab + 3 * c [ " hdr " ] ) )
src = c [ " src " ]
if src [ 0 ] == " seed " :
u = dc + src [ 1 ]
elif src [ 0 ] == " tab " :
u = s_tab + 3 * src [ 1 ]
else : # ("mseg", off)
u = s_mseg + src [ 1 ]
segs . append ( ( c [ " foff " ] + 3 , c [ " olen " ] , u ) )
elif c [ " kind " ] == " lzma " :
segs . append ( ( c [ " foff " ] , c [ " size " ] , s_mech + c [ " mech " ] ) )
else : # term:并入前一个载荷段
pf , pl , pu = segs [ - 1 ]
segs [ - 1 ] = ( pf , pl + 1 , pu )
segs . append ( ( hoff , H , s_H ) ) # F[hoff:] 头部
pos = 0
for ( fo , ln , u ) in segs :
assert fo == pos , " 段不连续: %d != %d " % ( fo , pos )
assert ln > = 2 , " 段太短 %d @ %d " % ( ln , fo )
pos + = ln
assert pos == total , " 段总长 %d != total %d " % ( pos , total )
# 生成 match 链,按 2 MiB 上限切成多个 0xC0 chunk
mseg = bytearray ( )
out_pos = d
cur , cur_len = [ ] , 0
chunks = [ ]
for ( fo , ln , u ) in segs :
dist = ( d + fo ) - u
assert 0 < dist , " dist= %d @ %d " % ( dist , fo )
toks = matches_for ( dist , ln )
if cur_len + ln > LZ2_MAXU - MAX_MATCH :
chunks . append ( ( cur , out_pos , cur_len ) )
out_pos + = cur_len
cur , cur_len = [ ] , 0
cur . extend ( toks )
cur_len + = ln
if cur :
chunks . append ( ( cur , out_pos , cur_len ) )
out_pos + = cur_len
assert out_pos == d + total , " Mseg 输出 %d != %d " % ( out_pos , d + total )
for ( toks , op , cl ) in chunks :
blk , t = lzma_chunk ( toks , op )
assert t == cl
mseg . extend ( blk )
return bytes ( mseg )
# ---------- F 中承载 seed[soff] 的那个字节的偏移 ----------
def _f_off_of_seed ( self , lay , soff ) :
""" 返回 (F 偏移, 该 store 载荷内从 soff 起还剩多少字节)。
seed_head 超过 64 KiB 时会被切成多片,所以调用方要循环推进。 """
for c in lay [ " ochunks " ] :
if c [ " kind " ] == " store " and c [ " src " ] [ 0 ] == " seed " :
s0 = c [ " src " ] [ 1 ]
if s0 < = soff < s0 + c [ " olen " ] :
return c [ " foff " ] + 3 + ( soff - s0 ) , s0 + c [ " olen " ] - soff
raise RuntimeError ( " seed 偏移 %d 未被 store 载荷覆盖 " % soff )
def _f_pos_list ( self , lay , soff , length ) :
""" seed[soff:soff+length] 在 F 中对应的字节位置列表(可能跨多片)。 """
res = [ ]
while length > 0 :
p , avail = self . _f_off_of_seed ( lay , soff )
a = min ( length , avail )
res . extend ( range ( p , p + a ) )
soff + = a
length - = a
return res
# ---------- 装配 ----------
def assemble ( self , lay ) :
total , H = lay [ " total " ] , lay [ " H " ]
hoff = total - H
C , plant = lay [ " C " ] , lay [ " plant " ]
F = bytearray ( total )
# pass A: 签名头 + 所有非 store 载荷字节
F [ 0 : 6 ] = SIG
F [ 6 : 8 ] = VER
struct . pack_into ( " <Q " , F , 12 , lay [ " n " ] )
struct . pack_into ( " <Q " , F , 20 , H )
for c in lay [ " ochunks " ] :
if c [ " kind " ] == " store " :
F [ c [ " foff " ] : c [ " foff " ] + 3 ] = lay [ " hdr_tab " ] [ c [ " hdr " ] ]
else :
F [ c [ " foff " ] : c [ " foff " ] + c [ " size " ] ] = c [ " bytes " ]
F [ hoff : hoff + H ] = lay [ " header " ]
# pass B: seed = C副本 ‖ S32副本 ‖ H副本 ‖ plant
seed = bytearray ( )
seed + = C
seed + = bytes ( F [ 0 : 32 ] )
seed + = bytes ( F [ hoff : hoff + H ] )
seed + = plant
assert len ( seed ) == lay [ " ds " ] , " seed %d != %d " % ( len ( seed ) , lay [ " ds " ] )
# pass C: 各 store 的载荷
msegz = lay [ " mseg " ] + b " \x00 "
for c in lay [ " ochunks " ] :
if c [ " kind " ] != " store " :
continue
p = c [ " foff " ] + 3
src , L = c [ " src " ] , c [ " olen " ]
if src [ 0 ] == " seed " :
F [ p : p + L ] = seed [ src [ 1 ] : src [ 1 ] + L ]
elif src [ 0 ] == " tab " :
F [ p : p + 3 ] = lay [ " hdr_tab " ] [ src [ 1 ] ]
else :
F [ p : p + L ] = msegz [ src [ 1 ] : src [ 1 ] + L ]
return F , bytes ( seed )
# ---------- CRC 定点(128x128 GF(2): seed/quine/Next/Start 四个 CRC) ----------
def solve_crc ( self , F , lay , C , plant ) :
H , hoff = lay [ " H " ] , lay [ " total " ] - lay [ " H " ]
n_sub , crc_base = lay [ " n_sub " ] , lay [ " crc_base " ]
lc = lay [ " lc " ]
# seed 里 S32 / H 副本在 F 中的镜像(可能跨多片,逐字节列出)
scopy0 = self . _f_pos_list ( lay , lc , 32 )
Fv = memoryview ( F )
def seed_crc ( ) :
v = crc32 ( C )
v = crc32 ( Fv [ 0 : 32 ] , v ) # S32 副本
v = crc32 ( Fv [ hoff : hoff + H ] , v ) # H 副本
return crc32 ( plant , v )
def targets ( ) :
return ( seed_crc ( ) , crc32 ( Fv ) , crc32 ( Fv [ hoff : hoff + H ] ) ,
crc32 ( Fv [ 12 : 32 ] ) )
# 已知:各内容文件的 CRC,写本体 + seed 里 H 副本的镜像两处
known = [ crc32 ( data ) for _ , data in self . files ]
for i , e in enumerate ( known ) :
slot = crc_base + 4 * i
b = struct . pack ( " <I " , e )
for k in range ( 4 ) :
F [ hoff + slot + k ] = b [ k ]
mir = self . _f_pos_list ( lay , lc + 32 + slot , 4 )
assert len ( mir ) == 4
for k in range ( 4 ) :
F [ mir [ k ] ] = b [ k ]
# 未知量:D_seed(seed 的 CRC)、D(quine 的 CRC)、N、S
# 每个未知量 4 字节,每字节有"本体 + seed 镜像"两个落点
qs = crc_base + 4 * len ( known ) # seed 子流的 CRC 槽
q = crc_base + 4 * ( n_sub - 1 ) # quine 子流的 CRC 槽
groups = [ ]
for slot in ( qs , q ) :
groups . append ( [ list ( range ( hoff + slot , hoff + slot + 4 ) ) ,
self . _f_pos_list ( lay , lc + 32 + slot , 4 ) ] )
groups . append ( [ list ( range ( 28 , 32 ) ) , scopy0 [ 28 : 32 ] ] ) # NextHeaderCRC
groups . append ( [ list ( range ( 8 , 12 ) ) , scopy0 [ 8 : 12 ] ] ) # StartHeaderCRC
nb = 32 * len ( groups )
base = targets ( )
basevec = 0
for i , v in enumerate ( base ) :
basevec | = v << ( 32 * i )
cols = [ ]
for g in range ( len ( groups ) ) :
own , mir = groups [ g ]
for kb in range ( 32 ) :
bi , bb = kb / / 8 , kb % 8
poss = [ own [ bi ] , mir [ bi ] ]
for p in poss :
F [ p ] ^ = ( 1 << bb )
t = targets ( )
for p in poss :
F [ p ] ^ = ( 1 << bb )
delta = 0
for i , v in enumerate ( t ) :
delta | = ( v ^ base [ i ] ) << ( 32 * i )
cols . append ( delta )
eqs = [ ]
for i in range ( nb ) :
coeff = 0
for j in range ( nb ) :
if ( cols [ j ] >> i ) & 1 :
coeff | = 1 << j
coeff ^ = 1 << i
eqs . append ( [ coeff , ( basevec >> i ) & 1 ] )
for j in range ( nb ) :
p = next ( ( i for i in range ( j , nb ) if ( eqs [ i ] [ 0 ] >> j ) & 1 ) , None )
if p is None :
raise RuntimeError ( " GF(2) 奇异 @bit %d " % j )
eqs [ j ] , eqs [ p ] = eqs [ p ] , eqs [ j ]
for i in range ( nb ) :
if i != j and ( ( eqs [ i ] [ 0 ] >> j ) & 1 ) :
eqs [ i ] [ 0 ] ^ = eqs [ j ] [ 0 ]
eqs [ i ] [ 1 ] ^ = eqs [ j ] [ 1 ]
x = 0
for i in range ( nb ) :
assert eqs [ i ] [ 0 ] == ( 1 << i )
if eqs [ i ] [ 1 ] :
x | = 1 << i
vals = [ ( x >> ( 32 * i ) ) & 0xFFFFFFFF for i in range ( len ( groups ) ) ]
for g in range ( len ( groups ) ) :
own , mir = groups [ g ]
b = struct . pack ( " <I " , vals [ g ] )
for k in range ( 4 ) :
F [ own [ k ] ] = b [ k ]
F [ mir [ k ] ] = b [ k ]
t = targets ( )
assert t == tuple ( vals ) , " CRC 定点失败: %s != %s " % ( t , vals )
return vals
def build ( self ) :
l0 = self . layout ( )
lay = self . finalize ( l0 [ " Y " ] , l0 [ " H " ] , l0 [ " M " ] )
F , seed = self . assemble ( lay )
crcs = self . solve_crc ( F , lay , lay [ " C " ] , lay [ " plant " ] )
# CRC 定点会改写 H / S32,而 seed 是它们的镜像,定点后需重建
hoff = lay [ " total " ] - lay [ " H " ]
seed = lay [ " C " ] + bytes ( F [ 0 : 32 ] ) + bytes ( F [ hoff : hoff + lay [ " H " ] ] ) \
+ lay [ " plant " ]
return bytes ( F ) , lay , seed , crcs
def verify_double ( F , lay , files , seed , content ) :
""" 串联两个原始 LZMA2 解码器还原 U,逐段校验。 """
d , total = lay [ " d " ] , lay [ " total " ]
dec_o = lzma . LZMADecompressor (
format = lzma . FORMAT_RAW ,
filters = [ { " id " : lzma . FILTER_LZMA2 , " dict_size " : lay [ " dict_size_out " ] } ] )
I = dec_o . decompress ( F [ 32 : 32 + lay [ " n " ] ] )
ok = True
if len ( I ) != lay [ " Li " ] :
print ( " [verify] 外层输出 %d != I %d " % ( len ( I ) , lay [ " Li " ] ) )
return False
dec_i = lzma . LZMADecompressor (
format = lzma . FORMAT_RAW ,
filters = [ { " id " : lzma . FILTER_LZMA2 , " dict_size " : lay [ " dict_size_in " ] } ] )
U = dec_i . decompress ( I )
exp = d + total
if len ( U ) != exp :
print ( " [verify] 内层输出 %d != %d " % ( len ( U ) , exp ) )
return False
dc , ds = lay [ " dc " ] , lay [ " ds " ]
if U [ : dc ] != content :
print ( " [verify] 内容不匹配 " )
ok = False
pos = 0
for rel , data in files : # 内容文件排在 U 的最前面
if U [ pos : pos + len ( data ) ] != data :
print ( " [verify] 文件不匹配: " , rel )
ok = False
pos + = len ( data )
assert pos == dc
if U [ dc : dc + ds ] != seed :
print ( " [verify] seed 不匹配 " )
ok = False
if U [ d : ] != F :
print ( " [verify] quine 自复制不匹配 " )
ok = False
print ( " [verify] 自解码: |I|= %d , |U|= %d , seed/文件/quine 全部匹配: %s "
% ( len ( I ) , len ( U ) , ok ) )
return ok
```
仅仅是大佬的一句话,AI就能做出来,实在是太可怕了。最终我试了一下,官方的7-Zip可以正常解压,但是Windows资源管理器不行……Windows资源管理器使用的也是[libarchive ](https://github.com/libarchive/libarchive ),似乎是因为libarchive只支持2个解码器,并且[第二个解码器只能是像BCJ这样的过滤器 ](https://github.com/libarchive/libarchive/blob/8bb3bbdc7b117a1e22086a2260f2087aafa90687/libarchive/archive_read_support_format_7zip.c#L1475 )……明明7-Zip官方是可以解压的,不知道如果把这个问题当作BUG报告给libarchive他们会不会解决?但目前存在兼容性问题的话我博客压缩包就先不用这个方案了吧🥲……
2026-09-30 16:01:13 +00:00
## 对TXZ格式的尝试
在做完7z格式的压缩包之后,我发现了一个问题,虽然7z确实很流行,但是在Linux下解压起来有点麻烦,7-Zip历史上主要面向Windows, Linux上长期以来更多依赖p7zip等第三方移植,因此生态集成度不如tar.xz,想要解压7z文件还得额外安装。
不过Linux下也有个支持LZMA2算法的压缩软件,那就是前些年出过[后门 ](https://tukaani.org/xz-backdoor/ )的XZ Utils,配合tar就可以做出TXZ( tar.xz)文件,甚至用我[博客终端 ](https://mabbs.github.io/linux/ )中的BusyBox也能解压。我想了一下反正有AI,干脆一句话让AI帮我把blogquine.py改成tar.xz格式的好了,结果倒也没费多少功夫,AI就这样写出来了:
<details markdown="1">
<summary markdown="span">
Show Code
</summary>
``` python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import binascii
import io
import lzma
import os
import struct
import sys
import tarfile
import time
import ctypes
import ctypes . util
# ============================================================
# Part 1: 最小 LZMA1 range coder(只做编码)
# ============================================================
kNumBitModelTotalBits = 11
kBitModelTotal = 1 << kNumBitModelTotalBits # 2048
kNumMoveBits = 5
kTopValue = 1 << 24 # 0x1000000
kNumStates = 12
kNumLitStates = 7
kNumPosBitsMax = 4
kNumLenToPosStates = 4
kNumAlignBits = 4
kEndPosModelIndex = 14
kNumFullDistances = 1 << ( kEndPosModelIndex >> 1 ) # 128
kMatchMinLen = 2
kNumLowLenBits = 3
kNumMidLenBits = 3
kNumHighLenBits = 8
kNumLowLenSymbols = 1 << kNumLowLenBits # 8
kNumMidLenSymbols = 1 << kNumMidLenBits # 8
kNumPosSlotBits = 6
PROB_INIT = kBitModelTotal >> 1 # 1024
class RangeEncoder :
""" LZMA 的区间编码器。low 是 64 位(要容纳进位),range 是 32 位。 """
def __init__ ( self ) :
self . low = 0
self . range = 0xFFFFFFFF
self . cache = 0
self . cache_size = 1 # 初值 1 -> 第一个输出字节恒为 0x00
self . buf = bytearray ( )
def _shift_low ( self ) :
if ( self . low & 0xFFFFFFFF ) < 0xFF000000 or ( self . low >> 32 ) != 0 :
temp = self . cache
while True :
self . buf . append ( ( temp + ( self . low >> 32 ) ) & 0xFF )
temp = 0xFF
self . cache_size - = 1
if self . cache_size == 0 :
break
self . cache = ( self . low >> 24 ) & 0xFF
self . cache_size + = 1
self . low = ( ( self . low & 0xFFFFFFFF ) << 8 ) & 0xFFFFFFFF
def encode_bit ( self , probs , idx , bit ) :
p = probs [ idx ]
bound = ( self . range >> kNumBitModelTotalBits ) * p
if bit == 0 :
self . range = bound
probs [ idx ] = p + ( ( kBitModelTotal - p ) >> kNumMoveBits )
else :
self . low + = bound
self . range - = bound
probs [ idx ] = p - ( p >> kNumMoveBits )
while self . range < kTopValue :
self . range = ( self . range << 8 ) & 0xFFFFFFFF
self . _shift_low ( )
def encode_direct_bits ( self , value , num_bits ) :
for i in range ( num_bits - 1 , - 1 , - 1 ) :
self . range >> = 1
if ( value >> i ) & 1 :
self . low + = self . range
while self . range < kTopValue :
self . range = ( self . range << 8 ) & 0xFFFFFFFF
self . _shift_low ( )
def bittree_encode ( self , probs , off , num_bits , symbol ) :
m = 1
for i in range ( num_bits - 1 , - 1 , - 1 ) :
bit = ( symbol >> i ) & 1
self . encode_bit ( probs , off + m , bit )
m = ( m << 1 ) | bit
def bittree_reverse_encode ( self , probs , off , num_bits , symbol ) :
m = 1
for i in range ( num_bits ) :
bit = symbol & 1
symbol >> = 1
self . encode_bit ( probs , off + m , bit )
m = ( m << 1 ) | bit
def finish ( self ) :
for _ in range ( 5 ) :
self . _shift_low ( )
return bytes ( self . buf )
def _pos_slot_and_bits ( d ) :
if d < 4 :
return d , 0 , 0
for slot in range ( 4 , 64 ) :
n = ( slot >> 1 ) - 1
base = ( 2 | ( slot & 1 ) ) << n
if d < base + ( 1 << n ) :
return slot , n , d - base
raise ValueError ( " distance too large: %d " % d )
# pb 必须与写进每个 LZMA2 chunk 头的 PROPS_BYTE(0x5D) 一致。
# lc/lp 只影响 literal 编码的概率表索引,而本编码器不实现 literal 路径,故无需常量。
PB = 2
class LzmaEncoder :
""" 只实现 quine 用到的两条路径:match 与 rep0-match。
literal / rep-g1 / rep-g2 三条分支从未被构造,因此它们对应的概率表
( p_lit、p_is_rep_g1、p_is_rep_g2)以及 prev_byte 都不必存在。
reps 同理:编码器从不回读(rep0 的距离由解码器自行维护),故不保存。
"""
def __init__ ( self ) :
self . pos_mask = ( 1 << PB ) - 1
self . rc = RangeEncoder ( )
self . pos = 0
self . state = 0
n = PROB_INIT
self . p_is_match = [ n ] * ( kNumStates << kNumPosBitsMax )
self . p_is_rep = [ n ] * kNumStates
self . p_is_rep_g0 = [ n ] * kNumStates
self . p_rep0_long = [ n ] * ( kNumStates << kNumPosBitsMax )
self . p_pos_slot = [ n ] * ( kNumLenToPosStates << kNumPosSlotBits )
self . p_spec_pos = [ n ] * ( kNumFullDistances - kEndPosModelIndex )
self . p_align = [ n ] * ( 1 << kNumAlignBits )
self . p_len_choice = [ n ] * 2
self . p_len_low = [ n ] * ( 16 * kNumLowLenSymbols )
self . p_len_mid = [ n ] * ( 16 * kNumMidLenSymbols )
self . p_len_high = [ n ] * ( 1 << kNumHighLenBits )
self . p_rep_len_choice = [ n ] * 2
self . p_rep_len_low = [ n ] * ( 16 * kNumLowLenSymbols )
self . p_rep_len_mid = [ n ] * ( 16 * kNumMidLenSymbols )
self . p_rep_len_high = [ n ] * ( 1 << kNumHighLenBits )
@property
def pos_state ( self ) :
return self . pos & self . pos_mask
def _encode_len ( self , choice , low , mid , high , length ) :
ps = self . pos_state
l = length - kMatchMinLen
if l < kNumLowLenSymbols :
self . rc . encode_bit ( choice , 0 , 0 )
self . rc . bittree_encode ( low , ps << kNumLowLenBits , kNumLowLenBits , l )
else :
self . rc . encode_bit ( choice , 0 , 1 )
l - = kNumLowLenSymbols
if l < kNumMidLenSymbols :
self . rc . encode_bit ( choice , 1 , 0 )
self . rc . bittree_encode ( mid , ps << kNumMidLenBits , kNumMidLenBits , l )
else :
self . rc . encode_bit ( choice , 1 , 1 )
self . rc . bittree_encode ( high , 0 , kNumHighLenBits , l - kNumMidLenSymbols )
def _write_dist ( self , dist , lts ) :
d = dist - 1
slot , n , low_bits = _pos_slot_and_bits ( d )
self . rc . bittree_encode ( self . p_pos_slot , lts << kNumPosSlotBits ,
kNumPosSlotBits , slot )
if slot > = 4 :
if slot < kEndPosModelIndex :
base = ( 2 | ( slot & 1 ) ) << n
off = base - slot - 1
self . rc . bittree_reverse_encode ( self . p_spec_pos , off , n , low_bits )
else :
self . rc . encode_direct_bits ( low_bits >> kNumAlignBits , n - kNumAlignBits )
self . rc . bittree_reverse_encode ( self . p_align , 0 , kNumAlignBits ,
low_bits & ( ( 1 << kNumAlignBits ) - 1 ) )
def match ( self , dist , length ) :
assert kMatchMinLen < = length < = 273 , length
ps = self . pos_state
self . rc . encode_bit ( self . p_is_match , ( self . state << kNumPosBitsMax ) + ps , 1 )
self . rc . encode_bit ( self . p_is_rep , self . state , 0 )
lts = min ( length - kMatchMinLen , kNumLenToPosStates - 1 )
self . _encode_len ( self . p_len_choice ,
self . p_len_low , self . p_len_mid , self . p_len_high , length )
self . _write_dist ( dist , lts )
self . state = 7 if self . state < kNumLitStates else 10
self . pos + = length
def rep_match ( self , length ) :
assert kMatchMinLen < = length < = 273 , length
ps = self . pos_state
self . rc . encode_bit ( self . p_is_match , ( self . state << kNumPosBitsMax ) + ps , 1 )
self . rc . encode_bit ( self . p_is_rep , self . state , 1 )
self . rc . encode_bit ( self . p_is_rep_g0 , self . state , 0 )
self . rc . encode_bit ( self . p_rep0_long , ( self . state << kNumPosBitsMax ) + ps , 1 )
self . _encode_len ( self . p_rep_len_choice ,
self . p_rep_len_low , self . p_rep_len_mid , self . p_rep_len_high , length )
self . state = 8 if self . state < kNumLitStates else 11
self . pos + = length
def finish ( self ) :
return self . rc . finish ( )
# ============================================================
# Part 2: tar + xz 格式原语
# ============================================================
MAX_MATCH = 273 # LZMA1 单个 match 长度上限
CHUNK = 65536 # LZMA2 单 chunk 解压上限
PROPS_BYTE = 0x5D # lc=3, lp=0, pb=2
SEED_NOTE = ( " \n Mayx ' s Blog! " ) . encode ( " utf-8 " )
# xz 格式常量
XZ_MAGIC = b " \xFD 7zXZ \x00 "
XZ_FOOTER_MAGIC = b " YZ "
XZ_CHECK_CRC64 = 0x04
LZMA2_FILTER_ID = 0x21
CHECK_SIZE = 8 # CRC64 占 8 字节
_XZ_FLAGS = bytes ( [ 0x00 , XZ_CHECK_CRC64 ] ) # Stream Flags: reserved + check_type
# tar 格式常量
TAR_BLOCK = 512
def round_up_512 ( n ) :
""" 长度按 tar 块 512 字节向上取整。 """
return ( n + TAR_BLOCK - 1 ) / / TAR_BLOCK * TAR_BLOCK
def crc32 ( b ) :
return binascii . crc32 ( b ) & 0xFFFFFFFF
# ---------- CRC64 (ECMA-182, reflected) ----------
_CRC64_POLY = 0xC96C5795D7870F42 # reflected ECMA-182
_CRC64_INIT = 0xFFFFFFFFFFFFFFFF
_CRC64_XOROUT = 0xFFFFFFFFFFFFFFFF
_CRC64_NON_REFLECTED = 0x142F0E1EBA9EA3693 # 非反射多项式 (65 bit)
_CRC64_MOD_BIT = 1 << 64 # x^64 对应的 bit
_liblzma = None
try :
_lzma_name = ctypes . util . find_library ( ' lzma ' )
if _lzma_name :
_liblzma = ctypes . CDLL ( _lzma_name )
_liblzma . lzma_crc64 . argtypes = [ ctypes . c_char_p , ctypes . c_size_t , ctypes . c_uint64 ]
_liblzma . lzma_crc64 . restype = ctypes . c_uint64
# 验证:CRC64("123456789") 应为 0x995dc9bbdf1939fa
if _liblzma . lzma_crc64 ( b ' 123456789 ' , 9 , 0 ) != 0x995dc9bbdf1939fa :
_liblzma = None
except ( OSError , AttributeError ) :
_liblzma = None
def _make_crc64_table ( ) :
table = [ ]
for i in range ( 256 ) :
crc = i
for _ in range ( 8 ) :
crc = ( crc >> 1 ) ^ _CRC64_POLY if ( crc & 1 ) else crc >> 1
table . append ( crc )
return table
_CRC64_TABLE = _make_crc64_table ( )
def _crc64_pure ( data ) :
""" 纯 Python CRC64( ECMA-182 反射,init/xorout = 0xFFFF...FFFF)。 """
crc = _CRC64_INIT
for byte in data :
crc = ( crc >> 8 ) ^ _CRC64_TABLE [ ( crc ^ byte ) & 0xFF ]
return crc ^ _CRC64_XOROUT
def _crc64_lib ( data ) :
""" liblzma CRC64( init=0,内部处理 init/xorout)。 """
return _liblzma . lzma_crc64 ( data , len ( data ) , 0 )
crc64 = _crc64_lib if _liblzma else _crc64_pure
# ---------- GF(2^64) 多项式运算 ----------
# 用于 CRC64 自引用求解。CRC64 的线性贡献可表示为
# bit_reverse(contribution(D)) = D_poly * P (mod G_non)
# 其中 D_poly = bit_reverse(D), P 是位置决定的多项式。
# 方程 D_poly * (1 ^ P1 ^ P2) = bit_reverse(CRC64(W)) 通过多项式逆元求解。
def _bit_reverse64 ( v ) :
r = 0
for _ in range ( 64 ) :
r = ( r << 1 ) | ( v & 1 )
v >> = 1
return r
def _poly_mul_mod ( a , b ) :
""" GF(2) 多项式乘法 mod G(非反射)。 """
result = 0
while b :
if b & 1 :
result ^ = a
b >> = 1
a << = 1
if a & _CRC64_MOD_BIT :
a ^ = _CRC64_NON_REFLECTED
return result
def _poly_pow ( base , exp ) :
""" 多项式幂:base^exp mod G。 """
result = 1
while exp :
if exp & 1 :
result = _poly_mul_mod ( result , base )
base = _poly_mul_mod ( base , base )
exp >> = 1
return result
def _poly_minv ( p ) :
""" 多项式逆元 p^(-1) mod G,用扩展欧几里得算法。 """
if p == 0 :
return 0
old_r , r = p , _CRC64_NON_REFLECTED
old_s , s = 1 , 0
while r :
# poly divmod(old_r, r) -> (q, rem)
probe_r = r . bit_length ( ) - 1
rem = old_r
q = 0
while rem . bit_length ( ) - 1 > = probe_r and rem :
shift = rem . bit_length ( ) - 1 - probe_r
q | = 1 << shift
rem ^ = r << shift
old_r , r = r , rem
# s = old_s ^ q*s (raw 多项式乘法)
prod = 0
a , b = q , s
while b :
if b & 1 :
prod ^ = a
b >> = 1
a << = 1
old_s , s = s , old_s ^ prod
if old_r != 1 :
return 0
# old_s mod G
probe_m = _CRC64_NON_REFLECTED . bit_length ( ) - 1
rem = old_s
while rem . bit_length ( ) - 1 > = probe_m and rem :
shift = rem . bit_length ( ) - 1 - probe_m
rem ^ = _CRC64_NON_REFLECTED << shift
return rem
def store_hdr ( payload_len , first = False ) :
""" LZMA2 uncompressed chunk 头(3 字节,大端 size-1)。 """
assert 1 < = payload_len < = 65536
return bytes ( [ 0x01 if first else 0x02 ] ) + ( payload_len - 1 ) . to_bytes ( 2 , " big " )
def matches_for ( dist , total ) :
""" dist 固定、总长 total 的 token 序列:首个 match + 后续 rep0。 """
assert total > = 2
toks = [ ]
first = min ( MAX_MATCH , total )
if total - first == 1 :
first - = 1
toks . append ( ( " m " , dist , first ) )
total - = first
while total > 0 :
l = min ( MAX_MATCH , total )
if total - l == 1 :
l - = 1
toks . append ( ( " r0 " , l ) )
total - = l
return toks
def _add_gear ( chunks , o , f , q ) :
""" 追加一组标准 gear: store 载荷 x = slip+3,紧跟一个 lzma 把那 x 字节复制一遍。
lzma chunk 解压出的字节数正好等于 x,所以齿轮转完之后 slip (f - (o-q)) 精确
归约为 len(cb)(很小的正数,x 被 CHUNK 截断时则按 CHUNK 缩减)。
_layout_iterate 反复套用把 slip 压到 <= 16, _trim_layouts 用它做相位微调。
返回追加后的 (o, f)。
"""
x = min ( f - ( o - q ) + 3 , CHUNK )
chunks . append ( { " kind " : " store " , " foff " : f , " size " : 3 + x ,
" ooff " : o , " olen " : x } )
o + = x
f + = 3 + x
cb , cu = lzma_chunk ( matches_for ( x , x ) , o )
chunks . append ( { " kind " : " lzma " , " foff " : f , " size " : len ( cb ) ,
" ooff " : o , " olen " : cu , " bytes " : cb } )
return o + cu , f + len ( cb )
def _forward_vac ( F , vac , q ) :
""" vac_store:把紧随其后的等长字节块前移覆盖自身。 """
fo = vac [ " ooff " ] - q
olen = vac [ " olen " ]
F [ fo : fo + olen ] = F [ fo + olen : fo + 2 * olen ]
def dict_prop_for ( maxdist ) :
""" 选最小的 LZMA2 dict prop 使字典 >= maxdist。 """
for p in range ( 41 ) :
if ( 2 | ( p & 1 ) ) << ( p / / 2 + 11 ) > = maxdist :
return p , ( 2 | ( p & 1 ) ) << ( p / / 2 + 11 )
raise ValueError ( " distance too large " )
def lzma_chunk ( tokens , out_pos ) :
""" 编一个 LZMA chunk( 0xC0: state+props reset,无 dict reset,无 end marker)。 """
enc = LzmaEncoder ( )
enc . pos = out_pos
total = 0
for t in tokens :
if t [ 0 ] == " m " :
enc . match ( t [ 1 ] , t [ 2 ] )
total + = t [ 2 ]
else :
enc . rep_match ( t [ 1 ] )
total + = t [ 1 ]
data = enc . finish ( )
assert total - 1 < 65536 and len ( data ) - 1 < 65536
hdr = bytes ( [ 0xC0 ] ) + ( total - 1 ) . to_bytes ( 2 , " big " ) + \
( len ( data ) - 1 ) . to_bytes ( 2 , " big " ) + bytes ( [ PROPS_BYTE ] )
return hdr + data , total
# ---------- tar 原语 ----------
def tar_header ( name , size , mtime , mode = 0o644 , typeflag = b ' 0 ' , uid = 0 , gid = 0 ) :
""" 构建 512 字节 POSIX ustar tar header。
注意:tar 数值字段包含 null 终止符,slice 范围必须精确匹配字段宽度。
mode/uid/gid 各 8 字节(7 octal + NUL),size/mtime 各 12 字节(11 octal + NUL)。
"""
h = bytearray ( 512 )
name_bytes = name . encode ( ' utf-8 ' ) [ : 100 ]
h [ 0 : len ( name_bytes ) ] = name_bytes
h [ 100 : 108 ] = b ' %07o \x00 ' % mode # 8 bytes (field 100-107)
h [ 108 : 116 ] = b ' %07o \x00 ' % uid # 8 bytes (field 108-115)
h [ 116 : 124 ] = b ' %07o \x00 ' % gid # 8 bytes (field 116-123)
h [ 124 : 136 ] = b ' %011o \x00 ' % size # 12 bytes (field 124-135)
h [ 136 : 148 ] = b ' %011o \x00 ' % mtime # 12 bytes (field 136-147)
h [ 148 : 156 ] = b ' ' # checksum placeholder (8 spaces)
h [ 156 : 157 ] = typeflag
h [ 257 : 263 ] = b ' ustar \x00 '
h [ 263 : 265 ] = b ' 00 '
assert len ( h ) == 512 , " header length %d != 512 " % len ( h )
# 计算校验和:所有字节之和,checksum 字段视为空格
chksum = sum ( h ) & 0o7777777
h [ 148 : 156 ] = b ' %06o \x00 ' % chksum # 6 octal + NUL + space = 8 bytes
assert len ( h ) == 512 , " header length %d != 512 after checksum " % len ( h )
return bytes ( h )
# ---------- xz 原语 ----------
def xz_varint ( v ) :
""" xz 变长整数编码:每字节 7 位数据(LSB first),MSB 为续位。 """
b = [ ]
while v > = 0x80 :
b . append ( ( v & 0x7F ) | 0x80 )
v >> = 7
b . append ( v & 0x7F )
return bytes ( b )
def xz_stream_header ( ) :
""" 12 字节 xz stream header (CHECK_CRC64)。
Stream Flags = [reserved(0x00), check_type(CRC64=0x04)]。
"""
flags = _XZ_FLAGS
crc = crc32 ( flags )
return XZ_MAGIC + flags + struct . pack ( ' <I ' , crc )
def xz_block_header ( dict_size ) :
""" xz block header(单 LZMA2 filter)。
返回 (header_bytes, 实际字典大小); header 长度即 block header 总长度。
"""
prop , real_dict = dict_prop_for ( dict_size )
# filter flags: filter_id(1) + props_size(1) + props(1=prop byte)
filter_flags = bytes ( [ LZMA2_FILTER_ID , 1 , prop ] )
# block header content: flags(1, 0x00=1 filter) + filter_flags
content = bytes ( [ 0x00 ] ) + filter_flags
# 填充到 (1 + len(content) + 4) 是 4 的倍数
total = 1 + len ( content ) + 4
pad = ( 4 - total % 4 ) % 4
content + = b ' \x00 ' * pad
bh = 1 + len ( content ) + 4
assert bh % 4 == 0 , " bh not 4-aligned: %d " % bh
crc = crc32 ( bytes ( [ bh / / 4 - 1 ] ) + content )
header = bytes ( [ bh / / 4 - 1 ] ) + content + struct . pack ( ' <I ' , crc )
assert len ( header ) == bh
return header , real_dict
def xz_index ( records ) :
""" xz index。records = [(unpadded_size, uncompressed_size), ...]。 """
data = bytes ( [ 0x00 ] ) # index indicator
data + = xz_varint ( len ( records ) )
for unpadded , uncompressed in records :
data + = xz_varint ( unpadded )
data + = xz_varint ( uncompressed )
# 填充到 (len(data) + 4) 是 4 的倍数
pad = ( 4 - ( len ( data ) + 4 ) % 4 ) % 4
data + = b ' \x00 ' * pad
return data + struct . pack ( ' <I ' , crc32 ( data ) )
def xz_stream_footer ( backward_size ) :
""" 12 字节 xz stream footer (CHECK_CRC64)。
backward_size = (index_size / 4) - 1。
Stream Flags = [reserved(0x00), check_type(CRC64=0x04)]。
CRC32 覆盖 Backward Size + Stream Flags( 6 字节,不含 CRC32 和 Footer Magic)。
"""
flags = _XZ_FLAGS
crc_data = struct . pack ( ' <I ' , backward_size ) + flags # 6 bytes, no magic
crc = crc32 ( crc_data )
return struct . pack ( ' <I ' , crc ) + crc_data + XZ_FOOTER_MAGIC
# ============================================================
# Part 3: 多文件 tar.xz quine 构造器
# ============================================================
class TarXzQuine :
def __init__ ( self , root , quine_name = " quine.tar.xz " , seed_name = " .this_is_mayx_blog " ,
src_dir = " " ) :
self . quine_name = quine_name
self . seed_name = seed_name
self . src_dir = src_dir . strip ( " / " )
self . mtime = int ( time . time ( ) )
# walk 源目录
self . walk_entries = [ ]
self . files = [ ]
if self . src_dir :
parts = self . src_dir . split ( " / " )
for i in range ( 1 , len ( parts ) + 1 ) :
self . walk_entries . append ( ( " / " . join ( parts [ : i ] ) , True ) )
for dirpath , dirnames , filenames in os . walk ( root ) :
dirnames . sort ( )
for dn in dirnames :
rel = os . path . relpath ( os . path . join ( dirpath , dn ) , root ) . replace ( os . sep , " / " )
self . walk_entries . append ( ( self . _prefixed ( rel ) , True ) )
for fn in sorted ( filenames ) :
p = os . path . join ( dirpath , fn )
rel = os . path . relpath ( p , root ) . replace ( os . sep , " / " )
with open ( p , " rb " ) as fp :
data = fp . read ( )
self . walk_entries . append ( ( self . _prefixed ( rel ) , False ) )
self . files . append ( ( self . _prefixed ( rel ) , data ) )
# rel -> data 映射,避免下面三处按 rel 回头线性搜索整个 files 列表
self . file_map = dict ( self . files )
self . dirs = [ r for r , isd in self . walk_entries if isd ]
self . content = b " " . join ( data for _ , data in self . files )
def _prefixed ( self , rel ) :
return self . src_dir + " / " + rel if self . src_dir else rel
def tar_entries ( self , d_seed , xz_size ) :
""" 计算 tar 归档中每个条目的 (header, data_size, is_dir)。
顺序:seed, walk_entries (interleaved files+dirs), quine。
"""
entries = [ ]
# seed 文件
seed_hdr = tar_header ( self . seed_name , d_seed , self . mtime )
entries . append ( { " name " : self . seed_name , " hdr " : seed_hdr ,
" data_size " : d_seed , " is_dir " : False } )
# walk 顺序的文件和目录
for rel , isd in self . walk_entries :
if isd :
hdr = tar_header ( rel , 0 , self . mtime , mode = 0o755 , typeflag = b ' 5 ' )
entries . append ( { " name " : rel , " hdr " : hdr ,
" data_size " : 0 , " is_dir " : True } )
else :
# file_map 与 walk_entries 在 __init__ 里同步构造,这里必有
data = self . file_map [ rel ]
entries . append ( { " name " : rel , " hdr " : tar_header ( rel , len ( data ) , self . mtime ) ,
" data_size " : len ( data ) , " is_dir " : False } )
# quine 文件(放在最后)
qhdr = tar_header ( self . quine_name , xz_size , self . mtime )
entries . append ( { " name " : self . quine_name , " hdr " : qhdr ,
" data_size " : xz_size , " is_dir " : False } )
return entries
# ---------- 结构计算 ----------
def _compute_q ( self , d_seed ) :
""" 计算 xz_bytes 在 tar 中的偏移 q。
q = seed + files + dirs 的 tar 占用 + quine tar header。
q 不依赖 xz_size( quine 的 data 在 q 之后)。 """
q = 0
# seed 文件
q + = TAR_BLOCK # seed tar header
q + = round_up_512 ( d_seed ) # seed data + pad
# walk 顺序的文件和目录
for rel , isd in self . walk_entries :
q + = TAR_BLOCK # tar header
if not isd :
q + = round_up_512 ( len ( self . file_map [ rel ] ) )
# quine tar header
q + = TAR_BLOCK
return q
def _trim_layouts ( self , base , o_g , f_g , q , w_plant_off , d_seed ) :
""" 枚举 trim 配置,产出一批「相位」不同的候选布局。
trim = [可选的裸 store chunk,载荷长度 x0] + 一组标准 gear
( store 载荷 x = s+3,紧接着一个 lzma 复制这 x 字节)。
裸 store 把 slip 抬高 3、把 f 抬高 3+x0;随后这组 gear 把 slip 重新归一到
len(cb), jump 再归一到 -3。净效果是 (o_pre, f_pre) 被整体平移
δ ≈ s_g + 6 + len(cb) + 3 + x0,而 δ 决定了自洽方程的模 4 相位。
旧实现 δ 恒为 0,相位一旦不对就永远无解 —— 而 d_seed += 1 根本不改变
布局(q 只在跨 512 字节块时才变),所以那 80 次重试是纯粹的无效空转。
注意:不能只插一个裸的 lzma 复制块。lzma 复制块的输出必须等于
F[o-q : o-q+olen],而这只能靠前面那个「载荷 = F[o-q : o-q+x] 且 x = s+3」
的 store chunk 把字节搬到正确位置来实现;裸插复制块解压出来和 F 对不上。
返回 [(chunks, o_before_jump, f_before_jump, y, jb), ...],按文件体积升序。
"""
s_g = f_g - ( o_g - q )
out = [ ]
seen = set ( )
for x0 in range ( 0 , s_g + 4 ) :
chunks = list ( base )
o , f = o_g , f_g
if x0 :
# 裸 store:载荷 = F[o-q : o-q+x0],要求 x0 <= s+3 以免读到尚未定稿的字节
chunks . append ( { " kind " : " store " , " foff " : f , " size " : 3 + x0 ,
" ooff " : o , " olen " : x0 } )
o + = x0
f + = 3 + x0
o , f = _add_gear ( chunks , o , f , q ) # 一组标准 gear
# jump 不动点:y = s + 3 + len(jb)
s = f - ( o - q )
y = max ( 2 , s + 17 )
jb = ju = None
for _ in range ( 64 ) :
try :
jb , ju = lzma_chunk ( [ ( " m " , o - w_plant_off , y ) ] , o )
except AssertionError :
jb = None
break
y2 = s + 3 + len ( jb )
if y2 == y :
break
if y2 < 2 or y2 > 273 :
jb = None
break
y = y2
if jb is None or ju != y :
continue
if y + w_plant_off - TAR_BLOCK > d_seed :
continue
key = ( o + y , f + len ( jb ) )
if key in seen :
continue
seen . add ( key )
out . append ( ( chunks , o , f , y , jb ) )
out . sort ( key = lambda t : t [ 2 ] + len ( t [ 4 ] ) )
return out
def _solve_gadget ( self , chunks_pre , o_j , f_j , y , jb , q , bh , FEW ,
block_hdr , dict_size , hdrA , hdrB , d_seed , k ) :
""" 在一个给定相位的布局上求解 gadget( T / gb / suffix / tz / k)。
关键简化:tz 只依赖 u = gb + suffix 与 k; T = u + tz + 4 也只依赖 (u, k);
而 gb 又由 T 唯一确定(len(lzma_chunk(matches_for(T, T))))。
因此只需一维枚举 u 即可遍历全部解,既不漏解也远快于原来的三重暴力。
"""
o_pre = o_j + y
f_pre = f_j + len ( jb )
if f_pre != ( o_pre - q ) - 3 : # jump 应把 slip 归一到 -3
return None
chunks = list ( chunks_pre )
chunks . append ( { " kind " : " lzma " , " foff " : f_j , " size " : len ( jb ) ,
" ooff " : o_j , " olen " : y , " bytes " : jb , " jump " : True } )
best = None
for u in range ( 8 , 512 ) :
# 512k 必须落在 [f_pre + 2u + 2059, f_pre + 2u + 3595)
lo = f_pre + 2 * u + 2059
hi = f_pre + 2 * u + 3595
for k_cand in range ( max ( 1 , ( lo - 512 ) / / 512 ) , ( hi + 512 ) / / 512 + 2 ) :
num = k_cand * 512 - ( o_pre + 2 * u + 8 - q - 1024 )
if num % 3 != 0 :
continue
tz_cand = num / / 3
if tz_cand < 1024 :
continue
T = u + tz_cand + 4
if T < 2 :
continue
gb , gu = lzma_chunk ( matches_for ( T , T ) , o_pre + T )
gb_len = len ( gb )
suffix = u - gb_len
if suffix < 1 :
continue
# 精确自检(不再用带 9 字节偏差的预筛公式)
f_final = f_pre + 3 + T + gb_len + 3 + tz_cand + 1
n = f_final - ( 12 + bh )
bp = ( 4 - ( 12 + bh + n ) % 4 ) % 4
unpadded = bh + n + CHECK_SIZE
idx = xz_index ( [ ( unpadded , q + k_cand * 512 + 1024 ) ] )
ix = len ( idx )
suffix_actual = bp + CHECK_SIZE + ix + 12
if suffix_actual != suffix :
continue
xz_size = 12 + bh + n + bp + CHECK_SIZE + ix + 12
xz_pad_actual = round_up_512 ( xz_size )
if xz_pad_actual != k_cand * 512 :
continue
total_w_actual = q + xz_pad_actual + 1024
o_final = o_pre + 2 * T + tz_cand
if o_final != total_w_actual :
continue
if best is not None and xz_size > = best [ " xz_size " ] :
continue # 已找到更小的解,跳过
backward_size = ix / / 4 - 1
final = list ( chunks )
final . append ( { " kind " : " store " , " foff " : f_pre , " size " : 3 + T ,
" ooff " : o_pre , " olen " : T , " vac " : True } )
final . append ( { " kind " : " lzma " , " foff " : f_pre + 3 + T ,
" size " : gb_len , " ooff " : o_pre + T , " olen " : gu ,
" bytes " : gb } )
final . append ( { " kind " : " store " ,
" foff " : f_pre + 3 + T + gb_len ,
" size " : 3 + tz_cand , " ooff " : o_pre + 2 * T ,
" olen " : tz_cand , " trailing " : True } )
final . append ( { " kind " : " term " ,
" foff " : f_pre + 3 + T + gb_len + 3 + tz_cand ,
" size " : 1 , " ooff " : o_final , " olen " : 0 ,
" bytes " : b " \x00 " } )
best = {
" q " : q , " d_seed " : d_seed , " k " : k ,
" chunks " : final , " block_hdr " : block_hdr , " bh " : bh ,
" n " : n , " xz_size " : xz_size ,
" T " : T , " suffix " : suffix_actual ,
" bp " : bp , " ix " : ix ,
" dict_size " : dict_size ,
" FEW " : FEW , " hdrA " : hdrA ,
" hdrB " : hdrB , " jump_y " : y , " index " : idx ,
" stream_hdr " : xz_stream_header ( ) ,
" footer " : xz_stream_footer ( backward_size ) ,
" entries " : self . tar_entries ( d_seed , xz_size ) ,
}
return best
def _layout_iterate ( self , d_seed , maxdist_hint ) :
""" 核心布局。
阶段 1a: C1 / repro / gears(只依赖 q,所有 trim 配置共用,只算一次)
阶段 1b:插入 trim 微调块,平移 (o_pre, f_pre) 改变模 4 相位
阶段 2 :按 u = gb + suffix 一维搜索自洽解
"""
block_hdr , dict_size = xz_block_header ( maxdist_hint )
bh = len ( block_hdr )
FEW = 12 + bh + 3
w_hdrA_off = TAR_BLOCK + 12 + bh
w_hdrB_off = TAR_BLOCK + 12 + bh + 3
w_plant_off = TAR_BLOCK + 12 + bh + 6
q = self . _compute_q ( d_seed )
# ---------- 阶段 1a: C1 + repro + gears ----------
base = [ ]
o , f = 0 , 12 + bh
Ls = [ ]
rem = q + FEW
while rem > CHUNK :
Ls . append ( CHUNK )
rem - = CHUNK
Ls . append ( rem )
assert Ls [ - 1 ] > = 2 , " 末 C1 chunk 载荷 %d 太小 " % Ls [ - 1 ]
k = len ( Ls )
hdrA = store_hdr ( CHUNK , first = False )
hdrB = store_hdr ( Ls [ - 1 ] , first = False )
S = 0
for j , L in enumerate ( Ls ) :
base . append ( { " kind " : " store " , " foff " : f , " size " : 3 + L ,
" ooff " : o , " olen " : L , " first " : j == 0 ,
" c1 " : True , " S " : S } )
o + = L
f + = 3 + L
S + = L
assert o == q + FEW
S = 0
for j , L in enumerate ( Ls ) :
if j > 0 :
srcpos = w_hdrA_off if ( j < k - 1 or L == CHUNK ) else w_hdrB_off
dist_h = ( q + FEW + S + 3 * ( j - 1 ) ) - srcpos
hb , hu = lzma_chunk ( [ ( " m " , dist_h , 3 ) ] , o )
base . append ( { " kind " : " lzma " , " foff " : f , " size " : len ( hb ) ,
" ooff " : o , " olen " : hu , " bytes " : hb } )
o + = hu
f + = len ( hb )
cb , cu = lzma_chunk ( matches_for ( q + FEW + 3 * j , L ) , o )
base . append ( { " kind " : " lzma " , " foff " : f , " size " : len ( cb ) ,
" ooff " : o , " olen " : cu , " bytes " : cb } )
o + = cu
f + = len ( cb )
S + = L
# gears:把 slip 压到 <= 16
while f - ( o - q ) > 16 :
o , f = _add_gear ( base , o , f , q )
o_g , f_g = o , f
# ---------- 阶段 1b + 阶段 2 ----------
# 相位按文件体积升序枚举;第一个成功的相位通常已经足够好,但不同相位的
# (u, tz) 不同,xz_size 仍可能相差几百字节,所以再多看几个取最小的。
tried = 0
best = None
since_hit = 0
for chunks_pre , o_j , f_j , y , jb in self . _trim_layouts (
base , o_g , f_g , q , w_plant_off , d_seed ) :
lay = self . _solve_gadget ( chunks_pre , o_j , f_j , y , jb , q , bh , FEW ,
block_hdr , dict_size , hdrA , hdrB ,
d_seed , k )
tried + = 1
if lay is not None and ( best is None
or lay [ " xz_size " ] < best [ " xz_size " ] ) :
best = lay
if best is not None :
since_hit + = 1
if since_hit > = 10 :
break
elif tried > = 80 : # 一直无解,放弃后续相位
break
if best is not None :
return best
raise RuntimeError ( " layout 不收敛: 无自洽解 (q= %d , f_pre= %d , o_pre= %d ) "
% ( q , f_g , o_g ) )
# ---------- 装配 ----------
def assemble ( self , lay ) :
""" 构建 xz 文件 F 和 seed。 """
F = bytearray ( lay [ " xz_size " ] )
q = lay [ " q " ]
d_seed = lay [ " d_seed " ]
bh = lay [ " bh " ]
FEW = lay [ " FEW " ]
# bytearray 已全零初始化:block padding、CRC64 占位、trailing-zero 载荷
# 都不必再显式写 0(后面几处赋值只会写到各自独立的区间,不会交叉覆盖)。
# pass A: 写 xz stream header + block header + 所有 chunk bytes + suffix
F [ 0 : 12 ] = lay [ " stream_hdr " ]
F [ 12 : 12 + bh ] = lay [ " block_hdr " ]
jump_c = None
for c in lay [ " chunks " ] :
if c [ " kind " ] == " store " :
F [ c [ " foff " ] : c [ " foff " ] + 3 ] = store_hdr ( c [ " olen " ] ,
first = c . get ( " first " , False ) )
else :
F [ c [ " foff " ] : c [ " foff " ] + c [ " size " ] ] = c [ " bytes " ]
if c . get ( " jump " ) :
jump_c = c
# block padding + CRC64(pass D 填) + index + footer
bp_off = 12 + bh + lay [ " n " ]
ix_off = bp_off + lay [ " bp " ] + CHECK_SIZE
F [ ix_off : ix_off + lay [ " ix " ] ] = lay [ " index " ]
sf_off = ix_off + lay [ " ix " ]
F [ sf_off : sf_off + 12 ] = lay [ " footer " ]
assert jump_c is not None
# pass B: 构建 seed
y = lay [ " jump_y " ]
plant = bytes ( F [ jump_c [ " ooff " ] - q : jump_c [ " ooff " ] - q + y ] )
seed = bytearray ( d_seed )
seed [ 0 : 12 ] = lay [ " stream_hdr " ]
seed [ 12 : 12 + bh ] = lay [ " block_hdr " ]
seed [ 12 + bh : 12 + bh + 3 ] = lay [ " hdrA " ]
seed [ 12 + bh + 3 : 12 + bh + 6 ] = lay [ " hdrB " ]
seed [ 12 + bh + 6 : 12 + bh + 6 + y ] = plant
pad = ( SEED_NOTE * ( d_seed / / len ( SEED_NOTE ) + 2 ) ) [ : d_seed - 12 - bh - 6 - y ]
seed [ 12 + bh + 6 + y : ] = pad
# 构建 tar 前缀 T(含 seed data)
T = self . _build_tar_prefix_with_seed ( lay , seed )
F_prefix = bytes ( F [ 0 : FEW ] )
P = T + F_prefix
assert len ( P ) == q + FEW , " P 长度 %d != q+FEW %d " % ( len ( P ) , q + FEW )
# pass C: 填充 store payloads
for c in lay [ " chunks " ] :
if c [ " kind " ] != " store " :
continue
ooff , olen = c [ " ooff " ] , c [ " olen " ]
if c . get ( " c1 " ) :
F [ c [ " foff " ] + 3 : c [ " foff " ] + 3 + olen ] = P [ c [ " S " ] : c [ " S " ] + olen ]
elif c . get ( " trailing " ) :
# 载荷是尾部零:F 全零初始化,且唯一会写到 chunk 之外的 vac_store
# 目标是 [f_pre+3, f_pre+3+T)( f_pre == (o_pre-q)-3 已由 _solve_gadget
# 断言),与本区块不重叠,因此无需写入。
continue
elif c . get ( " vac " ) :
_forward_vac ( F , c , q )
else :
# 其余 store 的载荷 = 输出流自身对应位置的字节(自引用复制)
fo = ooff - q
F [ c [ " foff " ] + 3 : c [ " foff " ] + 3 + olen ] = F [ fo : fo + olen ]
# pass D: 求解 CRC64 自引用
self . _solve_crc64 ( F , lay , T )
return bytes ( F ) , bytes ( seed )
def _build_tar_prefix_with_seed ( self , lay , seed ) :
""" 构建 tar 前缀 T(含 seed data)。 """
entries = lay [ " entries " ]
T = bytearray ( )
for e in entries [ : - 1 ] :
T + = e [ " hdr " ]
if not e [ " is_dir " ] and e [ " data_size " ] > 0 :
data = seed if e [ " name " ] == self . seed_name else self . file_map [ e [ " name " ] ]
T + = data
T + = b ' \x00 ' * ( round_up_512 ( e [ " data_size " ] ) - e [ " data_size " ] )
T + = entries [ - 1 ] [ " hdr " ] # quine tar header
return bytes ( T )
def _solve_crc64 ( self , F , lay , T_prefix ) :
""" 求解 CRC64 自引用。
CRC64 值 D = CRC64(W), W = T + F + 尾部零。
D 在 W 中出现两次:F 的 CRC64 字段 + vac_store 副本。
解法(多项式逆元):
CRC64 的线性贡献可表示为 GF(2^64) 多项式乘法:
bit_reverse(contribution(D)) = D_poly * P (mod G)
其中 D_poly = bit_reverse(D), P = x^(64+trailing) mod G。
方程 D_poly * (1 ^ P1 ^ P2) = bit_reverse(CRC64(W)) (mod G)
用扩展欧几里得求 (1 ^ P1 ^ P2) 的逆元,一步求解。
"""
q = lay [ " q " ]
bh = lay [ " bh " ]
n = lay [ " n " ]
bp = lay [ " bp " ]
xz_size = lay [ " xz_size " ]
T = lay [ " T " ]
# CRC64 位置 1:在 F 中(block padding 后)
crc_f_off = 12 + bh + n + bp
crc_w1 = q + crc_f_off
# CRC64 位置 2: vac_store 副本
crc_f_copy = crc_f_off - T
crc_w2 = q + crc_f_copy
# 构造 W = T + F + 尾部零(先把两处 CRC64 置 0)
xz_pad = round_up_512 ( xz_size )
tz = xz_pad - xz_size + 1024
W = bytearray ( T_prefix ) + F + b ' \x00 ' * tz
W [ crc_w1 : crc_w1 + CHECK_SIZE ] = b ' \x00 ' * CHECK_SIZE
W [ crc_w2 : crc_w2 + CHECK_SIZE ] = b ' \x00 ' * CHECK_SIZE
# CRC64(W) 的多项式表示
crc_poly = _bit_reverse64 ( crc64 ( bytes ( W ) ) )
# P1 = x^(64 + 位置1之后的bit数) mod G
trailing1 = ( len ( W ) - crc_w1 - 8 ) * 8
P1 = _poly_pow ( 2 , 64 + trailing1 )
# P2 = x^(64 + 位置2之后的bit数) mod G
trailing2 = ( len ( W ) - crc_w2 - 8 ) * 8
P2 = _poly_pow ( 2 , 64 + trailing2 )
# D_poly = crc_poly * inv(1 ^ P1 ^ P2)
coeff = 1 ^ P1 ^ P2
inv = _poly_minv ( coeff )
if inv == 0 :
raise RuntimeError ( " CRC64 多项式无逆元 " )
D_poly = _poly_mul_mod ( crc_poly , inv )
D = _bit_reverse64 ( D_poly )
# 写入 D 到 F 的 CRC64 位置
struct . pack_into ( ' <Q ' , F , crc_f_off , D )
# 重新执行 vac_store 副本
_forward_vac ( F , next ( c for c in lay [ " chunks " ] if c . get ( " vac " ) ) , q )
# 验证
W2 = bytearray ( T_prefix ) + F + b ' \x00 ' * tz
assert crc64 ( bytes ( W2 ) ) == D , " CRC64 求解验证失败 "
def build ( self , maxdist_hint = None ) :
if maxdist_hint is None :
maxdist_hint = 2 * ( len ( self . content ) + 128 ) + ( 1 << 21 )
last_err = None
# d_seed 在同一 512 字节块内不改变 q(seed 数据按 512 对齐),所以旧的
# "d_seed += 1" 重试完全不会改变布局,只是空转 80 次。真正需要 d_seed
# 变化的情况只有两种:seed 装不下 jump 种植串,或需要跨块改变 q 作为兜底。
for d_seed in ( 64 , 96 , 128 , 160 , 192 , 256 , 320 , 384 , 448 ,
576 , 704 , 832 , 960 , 1088 , 1600 , 2112 , 2624 , 3648 ) :
try :
lay = self . _layout_iterate ( d_seed , maxdist_hint )
F , seed = self . assemble ( lay )
return F , lay , seed
except ( RuntimeError , AssertionError , ValueError ) as e :
last_err = e
raise RuntimeError ( " build 多次失败: %s " % last_err )
# ============================================================
# Part 4: 验证 + main
# ============================================================
def verify ( F , lay , files , quine_name ) :
""" 验证:解压 xz → 解析 tar → 检查文件 + quine 自复制。 """
# 1. 解压 xz
try :
dec = lzma . LZMADecompressor ( format = lzma . FORMAT_XZ )
tar_data = dec . decompress ( F )
except Exception as e :
print ( " [verify] xz 解压失败: %s " % e )
return False
# 2. 检查 quine 自复制
if tar_data [ lay [ " q " ] : lay [ " q " ] + lay [ " xz_size " ] ] != F :
print ( " [verify] quine 自复制不匹配 " )
a = tar_data [ lay [ " q " ] : lay [ " q " ] + lay [ " xz_size " ] ]
for i in range ( min ( len ( a ) , len ( F ) ) ) :
if a [ i ] != F [ i ] :
print ( " [verify] 首个不匹配在偏移 %d : tar= %02x vs xz= %02x " % ( i , a [ i ] , F [ i ] ) )
break
return False
# 3. 解析 tar
try :
tf = tarfile . open ( fileobj = io . BytesIO ( tar_data ) )
members = tf . getmembers ( )
except Exception as e :
print ( " [verify] tar 解析失败: %s " % e )
return False
print ( " [verify] tar 条目: %s " % [ m . name for m in members ] )
# 4. 检查源文件
ok = True
for rel , data in files :
try :
f = tf . extractfile ( rel )
if f is None :
print ( " [verify] 文件 %s 是目录或不存在 " % rel )
ok = False
continue
extracted = f . read ( )
if extracted != data :
print ( " [verify] 文件 %s 内容不匹配 " % rel )
ok = False
except KeyError :
print ( " [verify] 文件 %s 不在 tar 中 " % rel )
ok = False
# 5. 检查 quine 文件
try :
qf = tf . extractfile ( quine_name )
if qf :
qdata = qf . read ( )
if qdata != F :
print ( " [verify] quine 文件内容不匹配 ( %d vs %d ) " % ( len ( qdata ) , len ( F ) ) )
ok = False
else :
print ( " [verify] quine 文件匹配! " )
except KeyError :
print ( " [verify] quine 文件不在 tar 中 " )
ok = False
print ( " [verify] 结果: %s " % ( " 通过 " if ok else " 失败 " ) )
return ok
def main ( ) :
ap = argparse . ArgumentParser ( description = " 多文件 tar.xz quine 生成器 " )
ap . add_argument ( " srcdir " )
ap . add_argument ( " output " )
ap . add_argument ( " --quine-name " , default = None ,
help = " 归档内 quine 文件名(默认 = output 的文件名) " )
ap . add_argument ( " --seed-name " , default = " .this_is_mayx_blog " )
ap . add_argument ( " --src-dir " , default = " " ,
help = " 源文件在归档内的前缀目录 " )
ap . add_argument ( " --quine-dir " , default = " " ,
help = " quine 在归档内所在目录 " )
args = ap . parse_args ( )
quine_name = args . quine_name or os . path . basename ( args . output )
if args . quine_dir :
quine_dir = args . quine_dir . strip ( " / " )
quine_name = quine_dir + " / " + quine_name
bq = TarXzQuine ( args . srcdir , quine_name = quine_name , seed_name = args . seed_name ,
src_dir = args . src_dir )
print ( " [blogquine-tarxz] %d 个文件, %d 个目录, 内容 %d 字节 "
% ( len ( bq . files ) , len ( bq . dirs ) , len ( bq . content ) ) )
F , lay , seed = bq . build ( )
with open ( args . output , " wb " ) as fp :
fp . write ( F )
print ( " [blogquine-tarxz] written %s : %d 字节 (q= %d , k= %d chunks, n= %d , xz_size= %d ) "
% ( args . output , len ( F ) , lay [ " q " ] , lay [ " k " ] , lay [ " n " ] , lay [ " xz_size " ] ) )
print ( " [blogquine-tarxz] T= %d , suffix= %d (bp= %d , ix= %d ), dict_size= %d "
% ( lay [ " T " ] , lay [ " suffix " ] , lay [ " bp " ] , lay [ " ix " ] , lay [ " dict_size " ] ) )
ok = verify ( F , lay , bq . files , quine_name )
sys . exit ( 0 if ok else 1 )
if __name__ == " __main__ " :
main ( )
```
</details>
不过对我来说,相比于TXZ格式我还是更喜欢7z一点,一是因为LZMA2本来就是7-Zip的作者发明的,XZ感觉像是摘桃子的,二是TXZ这个名字听起来有点怪,感觉不像压缩包,三是XZ Utils出过后门,尽管整个Linux社区都在使用XZ,但是我还是稍微有点偏见,所以这份TXZ的生成器我就粘贴出来给需要的人吧,我博客用7z格式就好了。
# 感想
以前总是有人说AI没有创新能力,只是对曾经在网络上出现的东西进行重组,但人何尝不是这样呢?像这次制作的7z/TXZ Quine生成器在整个网络上没有任何公开信息,当然我也知道这并不是理论上的创新,但谁说组合创新不是创新呢?再看看最近OpenAI又解决了一大堆数学难题,完全可以相信AI是真的拥有智能,所以我相信总有一天AI将能完成人类能做的所有事情,人类将不再需要额外的思考,只需要做自己想做的事情吧。