mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/base64.rb: backported from HEAD (modularised and documented)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@5682 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
995dd862a4
commit
275bd883e4
2 changed files with 129 additions and 73 deletions
|
@ -1,3 +1,7 @@
|
|||
Thu Feb 12 21:25:00 2004 Gavin Sinclair <gsinclair@soyabean.com.au>
|
||||
|
||||
* lib/base64.rb: backported from HEAD (modularised and documented)
|
||||
|
||||
Thu Feb 12 20:31:48 2004 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
* lib/mkmf.rb (create_tmpsrc): cpp32 of Borland C++ ignores #error
|
||||
|
|
198
lib/base64.rb
198
lib/base64.rb
|
@ -1,84 +1,136 @@
|
|||
#
|
||||
# = base64.rb: methods for base64-encoding and -decoding stings
|
||||
#
|
||||
# Author:: Yukihiro Matsumoto
|
||||
# Documentation:: Dave Thomas and Gavin Sinclair
|
||||
#
|
||||
# Until Ruby 1.8.1, these methods were defined at the top-level. Now
|
||||
# they are in the Base64 module but included in the top-level, where
|
||||
# their usage is deprecated.
|
||||
#
|
||||
# See Base64 for documentation.
|
||||
#
|
||||
|
||||
require "kconv"
|
||||
|
||||
# Perform encoding and decoding of binary data using a Base64
|
||||
# representation. This library rather unfortunately loads its four
|
||||
# methods directly into the top level namespace.
|
||||
|
||||
# The Base64 module provides for the encoding (#encode64) and decoding
|
||||
# (#decode64) of binary data using a Base64 representation.
|
||||
#
|
||||
# require "base64"
|
||||
# The following particular features are also provided:
|
||||
# - encode into lines of a given length (#b64encode)
|
||||
# - decode the special format specified in RFC2047 for the
|
||||
# representation of email headers (decode_b)
|
||||
#
|
||||
# enc = encode64('Send reinforcements')
|
||||
# puts enc
|
||||
# plain = decode64(enc)
|
||||
# puts plain
|
||||
|
||||
|
||||
|
||||
# Returns the Base64-decoded version of \obj{str}.
|
||||
# == Example
|
||||
#
|
||||
# require 'base64'
|
||||
# str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
|
||||
# 'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
|
||||
# 'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
|
||||
# puts decode64(str)
|
||||
# A simple encoding and decoding.
|
||||
#
|
||||
# require "base64"
|
||||
#
|
||||
# <i>Generates:</i>
|
||||
# enc = Base64.encode64('Send reinforcements')
|
||||
# # -> "U2VuZCByZWluZm9yY2VtZW50cw==\n"
|
||||
# plain = Base64.decode64(enc)
|
||||
# # -> "Send reinforcements"
|
||||
#
|
||||
# This is line one
|
||||
# This is line two
|
||||
# This is line three
|
||||
# And so on...
|
||||
# The purpose of using base64 to encode data is that it translates any
|
||||
# binary data into purely printable characters. It is specified in
|
||||
# RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html).
|
||||
|
||||
def decode64(str)
|
||||
str.unpack("m")[0]
|
||||
end
|
||||
module Base64
|
||||
module_function
|
||||
|
||||
# Returns the Base64-decoded version of +str+.
|
||||
#
|
||||
# require 'base64'
|
||||
# str = 'VGhpcyBpcyBsaW5lIG9uZQpUaGlzIG' +
|
||||
# 'lzIGxpbmUgdHdvClRoaXMgaXMgbGlu' +
|
||||
# 'ZSB0aHJlZQpBbmQgc28gb24uLi4K'
|
||||
# puts Base64.decode64(str)
|
||||
#
|
||||
# <i>Generates:</i>
|
||||
#
|
||||
# This is line one
|
||||
# This is line two
|
||||
# This is line three
|
||||
# And so on...
|
||||
|
||||
# Decodes text formatted using a subset of RFC2047 (the one used for
|
||||
# mime-encoding mail headers). Only supports an encoding type of 'b'
|
||||
# (base 64), and only supports the character sets ISO-2022-JP and
|
||||
# SHIFT_JIS (so the only two encoded word sequences recognized are
|
||||
# <tt>=?ISO-2022-JP?B?...=</tt> and
|
||||
# <tt>=?SHIFT_JIS?B?...=</tt>). Recognition of these sequences is case
|
||||
# insensitive.
|
||||
|
||||
def decode_b(str)
|
||||
str.gsub!(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) {
|
||||
decode64($1)
|
||||
}
|
||||
str = Kconv::toeuc(str)
|
||||
str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) {
|
||||
decode64($1)
|
||||
}
|
||||
str = Kconv::toeuc(str)
|
||||
str.gsub!(/\n/, ' ')
|
||||
str.gsub!(/\0/, '')
|
||||
str
|
||||
end
|
||||
|
||||
# Returns the Base64-encoded version of \obj{str}.
|
||||
#
|
||||
# require 'base64'
|
||||
# str = "Once\nupon\na\ntime." #!sh!
|
||||
# enc = encode64(str)
|
||||
# decode64(enc)
|
||||
|
||||
def encode64(bin)
|
||||
[bin].pack("m")
|
||||
end
|
||||
|
||||
# Prints the Base64 encoded version of _bin_ (a +String+) in lines of
|
||||
# _len_ (default 60) characters.
|
||||
#
|
||||
# require 'base64'
|
||||
# b64encode("Now is the time for all good coders\nto learn Ruby")
|
||||
#
|
||||
# Generates
|
||||
#
|
||||
# Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
|
||||
# UnVieQ==
|
||||
|
||||
def b64encode(bin, len = 60)
|
||||
encode64(bin).scan(/.{1,#{len}}/o) do
|
||||
print $&, "\n"
|
||||
def decode64(str)
|
||||
str.unpack("m")[0]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Decodes text formatted using a subset of RFC2047 (the one used for
|
||||
# mime-encoding mail headers).
|
||||
#
|
||||
# Only supports an encoding type of 'b' (base 64), and only supports
|
||||
# the character sets ISO-2022-JP and SHIFT_JIS (so the only two
|
||||
# encoded word sequences recognized are <tt>=?ISO-2022-JP?B?...=</tt> and
|
||||
# <tt>=?SHIFT_JIS?B?...=</tt>). Recognition of these sequences is case
|
||||
# insensitive.
|
||||
|
||||
def decode_b(str)
|
||||
str.gsub!(/=\?ISO-2022-JP\?B\?([!->@-~]+)\?=/i) {
|
||||
decode64($1)
|
||||
}
|
||||
str = Kconv::toeuc(str)
|
||||
str.gsub!(/=\?SHIFT_JIS\?B\?([!->@-~]+)\?=/i) {
|
||||
decode64($1)
|
||||
}
|
||||
str = Kconv::toeuc(str)
|
||||
str.gsub!(/\n/, ' ')
|
||||
str.gsub!(/\0/, '')
|
||||
str
|
||||
end
|
||||
|
||||
# Returns the Base64-encoded version of +str+.
|
||||
#
|
||||
# require 'base64'
|
||||
# Base64.b64encode("Now is the time for all good coders\nto learn Ruby")
|
||||
#
|
||||
# <i>Generates:</i>
|
||||
#
|
||||
# Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
|
||||
# UnVieQ==
|
||||
|
||||
def encode64(bin)
|
||||
[bin].pack("m")
|
||||
end
|
||||
|
||||
# _Prints_ the Base64 encoded version of +bin+ (a +String+) in lines of
|
||||
# +len+ (default 60) characters.
|
||||
#
|
||||
# require 'base64'
|
||||
# data = "Now is the time for all good coders\nto learn Ruby"
|
||||
# puts Base64.b64encode(data)
|
||||
#
|
||||
# <i>Generates:</i>
|
||||
#
|
||||
# Tm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBjb2RlcnMKdG8gbGVhcm4g
|
||||
# UnVieQ==
|
||||
|
||||
def b64encode(bin, len = 60)
|
||||
encode64(bin).scan(/.{1,#{len}}/o) do
|
||||
print $&, "\n"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
module Deprecated # :nodoc:
|
||||
include Base64
|
||||
|
||||
def _deprecated_base64(*args)
|
||||
m0, m1 = caller(0)
|
||||
m = m0[/\`(.*?)\'\z/, 1]
|
||||
warn("#{m1}: #{m} is deprecated; use Base64.#{m} instead")
|
||||
super
|
||||
end
|
||||
dep = instance_method(:_deprecated_base64)
|
||||
remove_method(:_deprecated_base64)
|
||||
for m in Base64.private_instance_methods(false)
|
||||
define_method(m, dep)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
include Base64::Deprecated
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue