Fix up Rubinius specific library specs.
[rbx.git] / lib / base64.rb
blobecb9ca1191bd5410435a3cb667cb52cd2acbb2c6
2 # = base64.rb: methods for base64-encoding and -decoding stings
4 # Author:: Yukihiro Matsumoto 
5 # Documentation:: Dave Thomas and Gavin Sinclair
7 # Until Ruby 1.8.1, these methods were defined at the top-level.  Now
8 # they are in the Base64 module but included in the top-level, where
9 # their usage is deprecated.
11 # See Base64 for documentation.
14 #require "kconv"
17 # The Base64 module provides for the encoding (#encode64) and decoding
18 # (#decode64) of binary data using a Base64 representation.
19
20 # The following particular features are also provided:
21 # - encode into lines of a given length (#b64encode)
22 # - decode the special format specified in RFC2047 for the
23 #   representation of email headers (decode_b)
25 # == Example
27 # A simple encoding and decoding. 
28
29 #     require "base64"
31 #     enc   = Base64.encode64('Send reinforcements')
32 #                         # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n" 
33 #     plain = Base64.decode64(enc)
34 #                         # -> "Send reinforcements"
36 # The purpose of using base64 to encode data is that it translates any
37 # binary data into purely printable characters.  It is specified in
38 # RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html).
40 module Base64
41   module_function
43   # Returns the Base64-decoded version of +str+.
44   #
45   #   require 'base64'
46   #   str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
47   #         'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
48   #         'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
49   #   puts Base64.decode64(str)
50   #
51   # <i>Generates:</i>
52   #
53   #    This is line one
54   #    This is line two
55   #    This is line three
56   #    And so on...
58   def decode64(str)
59     str.unpack("m")[0]
60   end
63   # Decodes text formatted using a subset of RFC2047 (the one used for
64   # mime-encoding mail headers).
65   #
66   # Only supports an encoding type of 'b' (base 64), and only supports
67   # the character sets ISO-2022-JP and SHIFT_JIS (so the only two
68   # encoded word sequences recognized are <tt>=?ISO-2022-JP?B?...=</tt> and
69   # <tt>=?SHIFT_JIS?B?...=</tt>).  Recognition of these sequences is case
70   # insensitive.
72   def decode_b(str)
73     str.gsub!(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) {
74       decode64($1)
75     }
76     #str = Kconv::toeuc(str)
77     str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) {
78       decode64($1)
79     }
80     #str = Kconv::toeuc(str)
81     str.gsub!(/\n/, ' ') 
82     str.gsub!(/\0/, '')
83     str
84   end
86   # Returns the Base64-encoded version of +str+.
87   #
88   #    require 'base64'
89   #    Base64.b64encode("Now is the time for all good coders\nto learn Ruby")
90   #
91   # <i>Generates:</i>
92   #
93   #    Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
94   #    UnVieQ==
96   def encode64(bin)
97     [bin].pack("m")
98   end
100   # _Prints_ the Base64 encoded version of +bin+ (a +String+) in lines of
101   # +len+ (default 60) characters.
102   #
103   #    require 'base64'
104   #    data = "Now is the time for all good coders\nto learn Ruby" 
105   #    Base64.b64encode(data)
106   #
107   # <i>Generates:</i>
108   #
109   #    Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
110   #    UnVieQ==
112   def b64encode(bin, len = 60)
113     encode64(bin).scan(/.{1,#{len}}/) do
114       print $&, "\n"
115     end
116   end