7 , 2 bayt
Şekil 7, 3-bit karakter kümesi kullanır, ancak baytlara paketlenmiş girdi alır (ve metaya göre, alt-bayt karakter kümelerine sahip diller diskteki dosya için bayt kullanılarak sayılır ). İşte xxd
programın bir dökümü:
00000000: 4cf4 L.
Bu dosyayı 7 yorumlayıcıya verirken, aşağıdaki programın çıktısını alır:
00000000: 4fa6 7f O..
daha sonra orijinal programı tekrar çıktılar.
Peki burada neler oluyor? Herhangi bir kaynak okuması yoktur (aslında, 7'de kaynağı okumanın mümkün olduğunu düşünmüyorum), ancak tartışmalı bir şekilde program başka bir şekilde hile yapıyor olsa da; ne düşündüğü söyle. Program şu şekilde çalışır. (Her 7 komutun, bazıları orijinal programda adı olmayan ve görünmeyen iki varyantı olduğunu unutmayın. Altı çiftte toplam on iki komut vardır. Aktif komutlar için kalın, pasif için kalın değilim komutları ve aktif komut adı yok durumlarda, bunu karşılık gelen pasif komutu ile aynı ada veriyorum ve ayırt etmek cesur güvenerek. örn hem adlandırılır durumda, 7
aktif varyantı olduğu 1
, her komut kendi adını alır ve kalın, sözdizimi vurgulamasıdır.)
231 7 23 Orijinal program, sekizli ambalajsız
231 itme 237 yığına
23 23'ü yığının üzerine itin
(örtük) yığının üst kısmının bir kopyasını programa ekle
2 Yığının üstünü çoğalt (şu anda 23 )
3 Yığının üstünden çıktı, pop ikinci yığın öğesi
Bu noktada, 7 yorumlayıcı yığının üst kısmının temsil edilemeyen komutlar ( 2
ve 3
) içerdiğini görür , bu nedenle yığının tepesinden kaçarak üretir 723
(ki). İlk komut çıktısı çıktı biçimini seçer; bu durumda, format 7, "çıktıyı programla aynı şekilde formatlayın". Böylece komutlar çıktıları baytlara paketlenir. Ardından program devam ediyor:
231 7 23 23
(örtük) yığının üst kısmının bir kopyasını programa ekle
2 Yığının üstünü çoğalt (şu anda 237 )
3 Yığının üstünden çıktı, ikinci yığın öğesi pop
7 Yığının üzerine boş bir öğe itin
Bu noktada, yığın üzerinde boş yığın elemanlarından başka bir şey yoktur, bu nedenle program çıkar. Daha 23
önce çıkardık. Kaçarsak 237
(ve tekrarlanamayan komutlar içerdiği için mecbur kalırız), oluruz 7231
. Bu doğrudan çıktıyı alır, programın son çıktısını alır (programla 237231
aynı şekilde biçimlendirilir, yani bayt olarak paketlenir). İşte 4fa67f
. ( 1
Çıktıyı etkilemek açısından tamamen anlamsız olduğu belirtilebilir ; bunun tek nedeni iki programı farklı kılmaktır.)
Koşmak 237231
neredeyse aynı şekilde devam eder; fark, işe yaramazlığın 1
ilk baskıdan hemen sonra çalışmasıdır (ve boş eleman, programın geçerli sonuna ikinci kez ulaşıldığında örtük olarak silinir). Yine, 231
sonuç çıktısı kendisini, 23
sonuç çıktısı kendisini önce a 7
ve biz 231723
orijinal program alır.
Gözlemci, iki programın, dilin "doğal" sekizli ile aynı uzunlukta olmasına rağmen, diskte farklı uzunluklarda olduğunu belirtebilir. Bunun nedeni, 7 programın rasgele sayıda 1 bit ile doldurulabilmesi ve paketlenmiş biçimin sondaki dolguyu atmasıdır. Kodlamanın nasıl gerçekleştiği aşağıda açıklanmıştır:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
Başka bir deyişle, iki bayt, 4C
F4
programı temsil etmek için yeterlidir, bu yüzden kullandım.