liblzma 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,131 @@
1
+ #vim: set fileencoding:utf-8
2
+
3
+ require_relative "liblzma.so"
4
+
5
+ module LZMA
6
+ module_function
7
+ def encode(data, *args)
8
+ s = Stream.encoder(Filter.lzma2(*args))
9
+ s.update(data, LZMA::FINISH)
10
+ end
11
+
12
+ module_function
13
+ def decode(data, *args)
14
+ s = Stream.auto_decoder(*args)
15
+ s.update(data, LZMA::FINISH)
16
+ end
17
+
18
+ module_function
19
+ def raw_encode(data, *args)
20
+ s = Stream.raw_encoder(*args)
21
+ s.update(data, LZMA::FINISH)
22
+ end
23
+
24
+ module_function
25
+ def raw_decode(data, *args)
26
+ s = Stream.raw_decoder(*args)
27
+ s.update(data, LZMA::FINISH)
28
+ end
29
+
30
+ class Stream
31
+ def self.encoder(*args)
32
+ Encoder.new(*args)
33
+ end
34
+
35
+ def self.decoder(*args)
36
+ Decoder.new(*args)
37
+ end
38
+
39
+ def self.auto_decoder(*args)
40
+ AutoDecoder.new(*args)
41
+ end
42
+
43
+ def self.raw_encoder(*args)
44
+ RawEncoder.new(*args)
45
+ end
46
+
47
+ def self.raw_decoder(*args)
48
+ RawDecoder.new(*args)
49
+ end
50
+ end
51
+
52
+ module Utils
53
+ class CRC32 < Struct.new(:state, :init)
54
+ def initialize(state = 0)
55
+ state = state.to_i
56
+ super(state, state)
57
+ end
58
+
59
+ def update(data)
60
+ self.state = Utils.crc32(data, state)
61
+ self
62
+ end
63
+
64
+ alias << update
65
+
66
+ def finish
67
+ self
68
+ end
69
+
70
+ def reset
71
+ self.state = init
72
+ self
73
+ end
74
+
75
+ def digest
76
+ [state].pack("N")
77
+ end
78
+
79
+ def hexdigest
80
+ "%08x" % state
81
+ end
82
+
83
+ alias to_s hexdigest
84
+
85
+ def to_str
86
+ "CRC32 <#{hexdigest}>"
87
+ end
88
+
89
+ alias inspect to_str
90
+ end
91
+
92
+ class CRC64 < Struct.new(:state, :init)
93
+ def initialize(state = 0)
94
+ state = state.to_i
95
+ super(state, state)
96
+ end
97
+
98
+ def update(data)
99
+ self.state = Utils.crc64(data, state)
100
+ self
101
+ end
102
+
103
+ alias << update
104
+
105
+ def finish
106
+ self
107
+ end
108
+
109
+ def reset
110
+ self.state = init
111
+ self
112
+ end
113
+
114
+ def digest
115
+ [state].pack("N")
116
+ end
117
+
118
+ def hexdigest
119
+ "%016x" % state
120
+ end
121
+
122
+ alias to_s hexdigest
123
+
124
+ def to_str
125
+ "CRC64 <#{hexdigest}>"
126
+ end
127
+
128
+ alias inspect to_str
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env ruby
2
+ #vim: set fileencoding:utf-8
3
+
4
+ # このrubyスクリプトはliblzmaの利用手引きを兼ねたサンプルスクリプトです。
5
+
6
+
7
+ # rubyでliblzmaの機能を利用するのに必要なのは、次の一文のみです
8
+ require "liblzma"
9
+
10
+
11
+ # 圧縮するデータを用意します
12
+ original_data = "0123456789abcdefghijklmnopqrstuvwxyz\n" * 10
13
+
14
+
15
+ # liblzmaを使って、データを圧縮します (xzデータストリームそのものが出力されます)
16
+ encoded_data = LZMA.encode(original_data)
17
+
18
+
19
+ # 圧縮レベルを変える場合は、第二引数に0から9の整数値を与えます
20
+ # この例は xz -1 と等価です
21
+ # (『9』を与える場合、作業メモリ空間が700MBほど必要になります)
22
+ encoded_data = LZMA.encode(original_data, 1)
23
+
24
+
25
+ # さらに細かい調整は、圧縮レベル(プリセット値)の後にハッシュ値を指定します
26
+ # この例ではプリセット値を省略しています
27
+ # (プリセット値の規定値はliblzma由来であり、『6』です)
28
+ encoded_data = LZMA.encode(original_data, mode: LZMA::MODE_FAST)
29
+
30
+ # この他にどんな値が与えられるかは、LZMA::Filter::LZMA2.newを参考にしてください
31
+
32
+
33
+ # 必要であればファイルに書き出しましょう
34
+ # xzデータストリームそのものです
35
+ File.write("sample.txt.xz", encoded_data, mode: "wb")
36
+
37
+ # 出力されたファイルがxzユーティリティ(もしくは7-Zip)で開けることを確認してください
38
+
39
+
40
+
41
+ # 圧縮されたデータを伸張してみましょう
42
+ # たったこれだけです
43
+ puts LZMA.decode(encoded_data)
44
+
45
+
46
+
47
+ # 今回は処理したいデータをあらかじめ用意してから、一気に処理を行う方法を提示しました
48
+ # 現実には少しずつデータを処理していく必要がある事例も少なくありません
49
+ # (巨大な――数ギガバイトにも及ぶ――ファイルなどはオンメモリでは現実的に処理できませんね)
50
+ # データを少しずつ圧縮/伸張していく、ストリーム志向での処理は 02-* にて提示します
51
+
52
+
53
+ # 今回利用したクラス/モジュール/メソッド
54
+ # LZMA.encode
55
+ # LZMA.decode
56
+
57
+
58
+ # [EOF]
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env ruby
2
+ #vim: set fileencoding:utf-8
3
+
4
+ # このrubyスクリプトはruby-lzmaの利用手引きを兼ねたサンプルスクリプトです。
5
+
6
+
7
+ # 01-* ではデータの全てを用意してから処理を行う方法を提示しますた。
8
+ # このサンプルではオンメモリでは難しい大きなデータを処理する方法を提示します。
9
+
10
+
11
+ # 始めはお決まりで
12
+ require "liblzma"
13
+
14
+ # 今回のサンプルでファイルI/Oを再現するためにStringIOを利用します
15
+ require "stringio"
16
+
17
+ # 圧縮元となるデータを用意します
18
+ original_data = "abcdefghijklmnopqrstuvwxyz" * 50
19
+
20
+
21
+ # まずは圧縮してみましょう
22
+ source = StringIO.new(original_data)
23
+ dest = ""
24
+ encoder = LZMA::Stream.encoder(LZMA::Filter.lzma2) # (1)
25
+ while fragment = source.read(16) # (2)
26
+ dest << encoder.update(fragment) # -
27
+ end # -
28
+ dest << encoder.finish # (3)
29
+
30
+ # (1) はじめに圧縮器を構築します
31
+ # LZMA::Stream.encoderの引数は、1つ以上をとることが出来ます (上限はliblzma由来となる4つです)
32
+ # LZMA::Filter.lzma2の引数は、LZMA.encodeの二つ目以降の引数と同じです
33
+ # (LZMA::Filter.lzma2(1) とか LZMA::Filter.lzma2(mode: LZMA::MODE_FAST) とか)
34
+ # (2) 取り込んだ部分データを処理します
35
+ # (3) データの終わりを通知し、圧縮器内に残ったデータを取り出します
36
+ # これを忘れるとxzデータストリームとして間違ったものが生成されます
37
+
38
+
39
+
40
+ encoded_data = dest
41
+
42
+
43
+ # 伸張も圧縮とほとんど同じです
44
+ source = StringIO.new(encoded_data)
45
+ dest = ""
46
+ decoder = LZMA::Stream.decoder # (1)
47
+ while fragment = source.read(16) # (2)
48
+ dest << decoder.update(fragment) # -
49
+ end # -
50
+ dest << decoder.finish # (3)
51
+
52
+ puts(dest == original_data ? "data ok" : "bad data")
53
+
54
+ # 圧縮時と伸張時の違いがわかりますか?
55
+ # はじめ(1)の伸張器の構築部分 (encoderかdecoderか) を変更するだけで、後は同じような文で処理を行えます
56
+
57
+
58
+ # 上の例ではxzデータストリームのみの対応です
59
+ # lzmaデータストリームは対象となりません
60
+ # xzもlzmaも区別なく伸張したい場合は、decoder ではなく auto_decoder を使います
61
+ source = StringIO.new(encoded_data)
62
+ dest = ""
63
+ decoder = LZMA::Stream.auto_decoder # (1)
64
+ while fragment = source.read(16) # (2)
65
+ dest << decoder.update(fragment) # -
66
+ end # -
67
+ dest << decoder.finish # (3)
68
+
69
+ puts(dest == original_data ? "data ok" : "bad data")
70
+
71
+
72
+
73
+ # 今回利用したクラス/モジュール/メソッド
74
+ # LZMA::Stream.encoder LZMA::Stream::Encoder.new と等価
75
+ # LZMA::Stream.decoder LZMA::Stream::Decoder.new と等価
76
+ # LZMA::Stream.auto_decoder LZMA::Stream::AutoDecoder.new と等価
77
+ # LZMA::Filter.lzma2 LZMA::Filter::LZMA2.new と等価
78
+ # LZMA::Stream#update
79
+ # LZMA::Stream#finish
80
+
81
+
82
+ # [EOF]
metadata ADDED
@@ -0,0 +1,53 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: liblzma
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.2'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - dearblue
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-03-31 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email: dearblue@users.sourceforge.jp
16
+ executables: []
17
+ extensions:
18
+ - ext/extconf.rb
19
+ extra_rdoc_files: []
20
+ files:
21
+ - README.txt
22
+ - ext/extconf.rb
23
+ - ext/liblzma.c
24
+ - lib/liblzma.rb
25
+ - samples/01-easy_using.rb
26
+ - samples/02-streaming.rb
27
+ homepage:
28
+ licenses:
29
+ - 2-clause BSD License
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: 1.9.3
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 1.8.16
49
+ signing_key:
50
+ specification_version: 3
51
+ summary: ruby bindings for liblzma that is included in the xz utilities
52
+ test_files: []
53
+ has_rdoc: false