nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 12 Dec 2017 14:11



Reply to topic  [ 95 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7
Недоархиватор SHAFF 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Shaos wrote:
Сделал запаковку-распаковку SHAFF1 :)

Подбиваю статистику - как подобъю, выложу сырцы ;)

P.S. Выложил: https://github.com/shaos/shaff

P.P.S. Статистику см. выше - на более рандомных файлах чуть-чуть не догоняю MegaLZ и ZX7, но хрум часто обхожу, не говоря уже об LZ4 :)

Перезалил сырцы - косячок небольшой пофиксил - с вероятностью 1/8 между блоками SHAFF1 записывался лишний байт из-за которого всё съезжало на больших файлах, теперь всё ок :)

Code:
    147,456 JRCARTS7.IMG - original
    130,281 JRCARTS8.IMG - my 00-00-00 compression
    112,745 JRCARTS7.IMGFF - my byte-oriented LZ77-like compression (SHAFF0) <<<<<<<<<<<<<<<<<<<<<<
    111,526 JRCARTS7.IMGFF - my byte-oriented LZ77-like compression (SHAFF0 with option -x92) <<<<<
    103,307 JRCARTS7.PP2 - RNC Pro Pack (method 2)
    101,009 JRCARTS7.ZX7
    100,180 JRCARTS7.IMG.hrm - Russian Hrum
     99,974 JRCARTS7.IMG.mlz - Russian MegaLZ
     98,045 JRCARTS7.IMGFF - my bit-oriented LZ77-like compression (SHAFF1) <<<<<<<<<<<<<<<<<<<<<<
     98,006 JRCARTS7.LZH - created by LHA v2.13
     80,016 JRCARTS7.IMG.bz2
     79,098 JRCARTS7.LZ4
     72,959 JRCARTS7.PP1 - RNC Pro Pack (method 1)
     71,950 JRCARTS7.zip - modern ZIP from Debian
     71,925 JRCARTS7.ARJ - created by ARJ v2.41a
     71,865 JRCARTS7.AIN - another Russian archiver from 90s
     71,855 JRCARTS7.ZIP - old PKZIP v2.06
     71,808 JRCARTS7.IMG.gz
     70,041 JRCARTS7.HA - HA 0.98 (Harri Hirvola)
     67,437 JRCARTS7.IMG.hst - Russian Hrust
     66,970 JRCARTS7.RAR - old RAR v1
     65,765 JRCARTS7.RAR - modern RAR v5
     62,543 JRCARTS7.7z - modern 7-zip
     62,508 JRCARTS7.IMG.xz - modern LZMA2

_________________
:eugeek: https://twitter.com/Shaos1973


08 Feb 2017 01:59
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Чото у меня задор почти на нет сошёл - надо побыстрее доделать SHAFF2 с Хаффманом пока маниакальная фаза совсем не разрядилась и не перешла в депрессивную :)

P.S. А мне ведь ещё "бублик-доменные" декодеры писать для всяких ретро-процыков надо будет...

_________________
:eugeek: https://twitter.com/Shaos1973


11 Feb 2017 17:56
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Сделал предопределённую таблицу Хаффмана для английского текста (за основу брал оригинал "Алисы в стране чудес"), добавив несколько спец-кодов, чтобы досовские текстовые файлы тоже обрабатывались - в результате получился массив 277 байт (под спойлером):
 Alice Huffman
Code:
unsigned char enghuf[] = {
/* === 4 bits === */ 0xFF,4,
/* 0x65 e 0001 */
   0x65,0x10,
/* === 5 bits === */ 0xFF,5,
/* 0x20   00000 */
   0x20,0x00,
/* 0x61 a 10111 */
   0x61,0xB8,
/* 0x73 s 10110 */
   0x73,0xB0,
/* 0x6F o 10100 */
   0x6F,0xA0,
/* 0x69 i 01111 */
   0x69,0x78,
/* 0x72 r 01110 */
   0x72,0x70,
/* 0x6E n 01011 */
   0x6E,0x58,
/* 0x74 t 01010 */
   0x74,0x50,
/* 0x6C l 01000 */
   0x6C,0x40,
/* 0x64 d 01100 */
   0x64,0x60,
/* === 6 bits === */ 0xFF,6,
/* 0x6D m 101010 */
   0x6D,0xA8,
/* 0x75 u 100111 */
   0x75,0x9C,
/* 0x70 p 100110 */
   0x70,0x98,
/* 0x2C , 100100 */
   0x2C,0x90,
/* 0x63 c 100010 */
   0x63,0x88,
/* 0x79 y 100001 */
   0x79,0x84,
/* 0x66 f 011011 */
   0x66,0x6C,
/* 0x77 w 011010 */
   0x77,0x68,
/* 0x67 g 010010 */
   0x67,0x48,
/* 0x68 h 001110 */
   0x68,0x38,
/* 0x22 " 001101 */
   0x22,0x34,
/* 0x62 b 001100 */
   0x62,0x30,
/* 0x2D - 001011 */
   0x2D,0x2C,
/* 0x0D   001001 */
   0x0D,0x24,
/* 0x0A   001000 */
   0x0A,0x20,
/* === 7 bits === */ 0xFF,7,
/* 0x6B k 1010110 */
   0x6B,0xAC,
/* 0x27 ' 1001010 */
   0x27,0x94,
/* 0x5F _ 1000111 */
   0x5F,0x8E,
/* 0x2E . 1000110 */
   0x2E,0x8C,
/* 0x49 I 1000001 */
   0x49,0x82,
/* 0x21 ! 0011110 */
   0x21,0x3C,
/* 0x76 v 0010100 */
   0x76,0x28,
/* 0x41 A 0000110 */
   0x41,0x0C,
/* 0x54 T 0000100 */
   0x54,0x08,
/* === 8 bits === */ 0xFF,8,
/* 0x3B ; 10101110 */
   0x3B,0xAE,
/* 0x3F ? 10010110 */
   0x3F,0x96,
/* 0x45 E 01001111 */
   0x45,0x4F,
/* 0x53 S 01001110 */
   0x53,0x4E,
/* 0x57 W 00111111 */
   0x57,0x3F,
/* 0x4E N 00101011 */
   0x4E,0x2B,
/* 0x44 D 00001111 */
   0x44,0x0F,
/* 0x4F O 00001110 */
   0x4F,0x0E,
/* 0x43 C 00001011 */
   0x43,0x0B,
/* 0x78 x 00001010 */
   0x78,0x0A,
/* === 9 bits === */ 0xFF,9,
/* 0x48 H 100101111 */
   0x48,0x97,0x80,
/* 0x52 R 100101110 */
   0x52,0x97,0x00,
/* 0x50 P 100000011 */
   0x50,0x81,0x80,
/* 0x46 F 100000010 */
   0x46,0x81,0x00,
/* 0x4D M 100000000 */
   0x4D,0x80,0x00,
/* 0x4C L 010011011 */
   0x4C,0x4D,0x80,
/* 0x3A : 010011010 */
   0x3A,0x4D,0x00,
/* 0x6A j 001111100 */
   0x6A,0x3E,0x00,
/* === 10 bits === */ 0xFF,10,
/* 0x7A z 1010111111 */
   0x7A,0xAF,0xC0,
/* 0x29 ) 1010111110 */
   0x29,0xAF,0x80,
/* 0x28 ( 1010111101 */
   0x28,0xAF,0x40,
/* 0x59 Y 1000000011 */
   0x59,0x80,0xC0,
/* 0x4B K 1000000010 */
   0x4B,0x80,0x80,
/* 0x56 V 0011111011 */
   0x56,0x3E,0xC0,
/* 0x42 B 0011111010 */
   0x42,0x3E,0x80,
/* 0x47 G 0010101011 */
   0x47,0x2A,0xC0,
/* 0x71 q 0010101001 */
   0x71,0x2A,0x40,
/* 0x55 U 0010101000 */
   0x55,0x2A,0x00,
/* === 11 bits === */ 0xFF,11,
/* 0x5D ] 10101111000 */
   0x5D,0xAF,0x00,
/* 0x5B [ 01001100101 */
   0x5B,0x4C,0xA0,
/* 0x51 Q 01001100100 */
   0x51,0x4C,0x80,
/* === 12 bits === */ 0xFF,12,
/* 0x4A J 101011110010 */
   0x4A,0xAF,0x20,
/* 0x09   101011110011 */
   0x09,0xAF,0x30,
/* === 13 bits === */ 0xFF,13,
/* 0x1A   0010101010110 */
   0x1A,0x2A,0xB0,
/* 0x1B   0010101010111 */
   0x1B,0x2A,0xB8,
/* 0x58 X 0010101010001 */
   0x58,0x2A,0x88,
/* 0x7E ~ 0010101010000 */
   0x7E,0x2A,0x80,
/* 0x24 $ 0010101010101 */
   0x24,0x2A,0xA8,
/* 0x23 # 0010101010100 */
   0x23,0x2A,0xA0,
/* 0x7D } 0010101010011 */
   0x7D,0x2A,0x98,
/* 0x7C | 0010101010010 */
   0x7C,0x2A,0x90,
/* 0x5E ^ 0100110011111 */
   0x5E,0x4C,0xF8,
/* 0x5C \ 0100110011110 */
   0x5C,0x4C,0xF0,
/* 0x7B { 0100110011101 */
   0x7B,0x4C,0xE8,
/* 0x60 ` 0100110011100 */
   0x60,0x4C,0xE0,
/* 0x3E > 0100110011011 */
   0x3E,0x4C,0xD8,
/* 0x3D = 0100110011010 */
   0x3D,0x4C,0xD0,
/* 0x5A Z 0100110011001 */
   0x5A,0x4C,0xC8,
/* 0x40 @ 0100110011000 */
   0x40,0x4C,0xC0,
/* 0x3C < 0100110001111 */
   0x3C,0x4C,0x78,
/* 0x2F / 0100110001110 */
   0x2F,0x4C,0x70,
/* 0x2B + 0100110001101 */
   0x2B,0x4C,0x68,
/* 0x2A * 0100110001100 */
   0x2A,0x4C,0x60,
/* 0x26 & 0100110001011 */
   0x26,0x4C,0x58,
/* 0x25 % 0100110001010 */
   0x25,0x4C,0x50,
/* 0x39 9 0100110001001 */
   0x39,0x4C,0x48,
/* 0x38 8 0100110001000 */
   0x38,0x4C,0x40,
/* 0x37 7 0100110000111 */
   0x37,0x4C,0x38,
/* 0x36 6 0100110000110 */
   0x36,0x4C,0x30,
/* 0x35 5 0100110000101 */
   0x35,0x4C,0x28,
/* 0x34 4 0100110000100 */
   0x34,0x4C,0x20,
/* 0x33 3 0100110000011 */
   0x33,0x4C,0x18,
/* 0x32 2 0100110000010 */
   0x32,0x4C,0x10,
/* 0x31 1 0100110000001 */
   0x31,0x4C,0x08,
/* 0x30 0 0100110000000 */
   0x30,0x4C,0x00,
/* === end of table === */ 0xFF,0xFF
};

А вот обновлённые опции:
Code:
SHAFF v1.1 (C) 2013,2017 A.A.Shabarshin <me@shaos.net>


Usage:
   shaff [options] filename

Encoding options:
   -0 to use SHAFF0 file format (by default)
   -1 to use SHAFF1 file format
   -2 to use SHAFF2 file format (experimental)
   -b to save blocks as separate files
   -lN to limit length of matches (default value is 4 for SHAFF0 and 2 for SHAFF1/2)
   -xHH to set prefix byte other than FF (applicable only to SHAFF0 file format)
   -e to set default table for English text (applicable only to SHAFF2 file format)

Decoding options:
   -d to decode compressed SHAFF file to file
   -c to decode compressed SHAFF file to screen

Пока опция -2 (SHAFF2) без опции -e (английский текст) не работает...

P.S. с "Алисой в стране чудес" и построенным под неё Хаффманом получилось вот так:
Code:
 54342 alice.txt - оригинал
 36263 alice.SHAFF0 <<< -1 (байтовый поток)
 27255 alice.SHAFF1 <<< -2 (битовый поток)
 26295 alice.ZX7
 25989 alice.PP2 (RNC Pro Pack method 2)
 25664 alice.LZ4
 24962 alice.txt.hrm
 24585 alice.txt.mlz
 24465 alice.SHAFF2 <<< -2 -e (битовый поток с Хаффманом для литералов по предопределённой таблице)
 22947 alice.txt.hst
 21892 alice.PP1 (RNC Pro Pack method 1)
 21856 alice.lzh (LHA 2.13)
 20788 alice.zip
 20706 alice.txt.gz
 20385 alice.rar
 20213 alice.ha (HA 0.98)
 19352 alice.txt.xz
 17953 alice.EX2 (Exomizer 2.0.9)
 17514 alice.txt.bz2

P.P.S. Обновил сырцы на гитхабе - размер файла shaff.c теперь стал 1906 строк...

P.P.P.S. Сишный исходник это не совсем английский текст, т.к. там часто встречаются символы, которых в обычном английском тексте крайне мало (как фигурные скобки, арифметические и логические операторы и т.д.), но тем не менее SHAFF2 таки его сильнее сжимает, чем SHAFF1, даже пользуясь Хаффманом для английского текста (опция -e), ожидаемо отставая от зипа :)
Code:
-rw-r--r-- 1 shaos shaos 46335 Feb 12 03:27 shaff.c - оригинальный файл (исходник shaff v1.1)
-rw-r--r-- 1 shaos shaos 16208 Feb 12 04:08 shaff.SHAFF0 <<< сжатие без опций
-rw-r--r-- 1 shaos shaos 12666 Feb 12 13:36 shaff.c.hrm
-rw-r--r-- 1 shaos shaos 12450 Feb 12 04:26 shaff.SHAFF1 <<< сжатие с опцией -1
-rw-r--r-- 1 shaos shaos 12373 Feb 12 13:36 shaff.c.mlz
-rw-r--r-- 1 shaos shaos 12262 Feb 12 13:56 shaff.SHAFF2 <<< сжатие с опциями -2 -e
-rw-r--r-- 1 shaos shaos 11541 Feb 12 13:36 shaff.c.hst
-rw-r--r-- 1 shaos shaos 10444 Feb 12 13:23 shaff.zip
-rw-r--r-- 1 shaos shaos 10434 Feb 12 03:27 shaff.c.gz
-rw-r--r-- 1 shaos shaos  9627 Feb 12 03:27 shaff.c.bz2
-rw-r--r-- 1 shaos shaos  9380 Feb 12 03:27 shaff.c.xz

P.P.P.P.S. Нашёл косячок в табличке - неправильно были указаны коды для символов > и = теперь всё ок:
https://github.com/shaos/shaff/blob/master/shaff.c

_________________
:eugeek: https://twitter.com/Shaos1973


12 Feb 2017 03:16
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
В следующей версии 1.2 можно окончательно допилить формат SHAFF2 (чтобы генерил своего Хаффмана для каждого файла если не задана опция -e) ну и многопоточность присобачить ибо у меня 16КБ блоки сжимаются независимо друг от друга :)

Возможные ассемблерные декодеры для трёх форматов:
- Z80 (перемещаемый)
- 8080
- 8086
- 6502
- PIC17
- NEDONAND ;)

Ну и на разных языках можно тоже для разнообразия - там бейсик ZX-спектрума, жаба, RW1 и т.д.

_________________
:eugeek: https://twitter.com/Shaos1973


12 Feb 2017 14:03
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 02:22
Posts: 15908
Location: Colorado
Reply with quote
Shaos wrote:
P.P.P.P.S. Нашёл косячок в табличке - неправильно были указаны коды для символов > и = теперь всё ок:
https://github.com/shaos/shaff/blob/master/shaff.c

Опция -b сломана оказалось - исправил и заодно расширил:
Code:
SHAFF v1.2 (C) 2013,2017 A.A.Shabarshin <me@shaos.net>


Usage:
   shaff [options] filename

Encoding options:
   -0 to use SHAFF0 file format (by default)
   -1 to use SHAFF1 file format
   -2 to use SHAFF2 file format (experimental)
   -b to compress blocks into separate files
   -bN to compress only block N
   -bN-M to compress blocks N..M
   -lN to limit length of matches (default value is 4 for SHAFF0 and 2 for SHAFF1/2)
   -xHH to set prefix byte other than FF (applicable only to SHAFF0 file format)
   -e to set default table for English text (applicable only to SHAFF2 file format)

Decoding options:
   -d to decode compressed SHAFF file to file
   -c to decode compressed SHAFF file to screen

Теперь на очереди параллельная компрессия блоков на всех доступных корах :)

_________________
:eugeek: https://twitter.com/Shaos1973


14 Feb 2017 00:14
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 95 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.