Base64 模块

Base64 模块提供用于

Base64 通常用于二进制数据不允许或不受支持的上下文中

Base64 编码字符串比其源大约三分之一。有关更多信息,请参阅 维基百科文章

此模块提供三对编码/解码方法。在这些方法中进行选择应取决于

注意:此页面上的示例假定包含的程序已执行

require 'base64'

编码字符集

Base64 编码字符串仅包含来自 64 个字符集的字符

如果您使用来自或放入 URL 的 Base64 编码字符串,则应选择 RFC-4648 兼容方法的此编码器-解码器对

否则,您可以在此模块中选择任意一对,包括上述一对或 RFC-2045 兼容对

填充

Base64 编码将三个输入字节更改为四个输出字符。

编码方法中的填充

填充 - 使用零、一个或两个尾部 = 字符扩展编码后的字符串 - 由方法 Base64.encode64Base64.strict_encode64 和默认情况下 Base64.urlsafe_encode64 执行

Base64.encode64('s')                         # => "cw==\n"
Base64.strict_encode64('s')                  # => "cw=="
Base64.urlsafe_encode64('s')                 # => "cw=="
Base64.urlsafe_encode64('s', padding: false) # => "cw"

执行填充时,编码后的字符串始终为长度为 4n,其中 n 是非负整数

当对正整数 n 抑制填充时

解码方法中的填充

所有 Base64 解码方法都支持(但不要求)填充。

方法 Base64.decode64 不检查填充的大小

Base64.decode64("MDEyMzQ1Njc") # => "01234567"
Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
Base64.decode64("MDEyMzQ1Njc==") # => "01234567"

方法 Base64.strict_decode64 严格执行填充大小

Base64.strict_decode64("MDEyMzQ1Njc")   # Raises ArgumentError
Base64.strict_decode64("MDEyMzQ1Njc=")  # => "01234567"
Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError

方法 Base64.urlsafe_decode64 允许在 str 中填充,如果存在,则必须正确:请参阅上面的 填充

Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.

换行符

Base64.encode64Base64.urlsafe_encode64 返回的编码字符串在每个 60 个字符序列后都有一个嵌入式换行符,并且如果非空,则在末尾

# No newline if empty.
encoded = Base64.encode64("\x00" *  0)
encoded.index("\n") # => nil

# Newline at end of short output.
encoded = Base64.encode64("\x00" *  1)
encoded.size        # => 4
encoded.index("\n") # => 4

# Newline at end of longer output.
encoded = Base64.encode64("\x00" * 45)
encoded.size        # => 60
encoded.index("\n") # => 60

# Newlines embedded and at end of still longer output.
encoded = Base64.encode64("\x00" * 46)
encoded.size                          # => 65
encoded.rindex("\n")                  # => 65
encoded.split("\n").map {|s| s.size } # => [60, 4]

要编码的字符串本身可能包含换行符,这些换行符编码为 Base64

  #   Base64.encode64("\n\n\n") # => "CgoK\n"
s = "This is line 1\nThis is line 2\n"
Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"

常量

VERSION

公共实例方法

decode64(str) 单击以切换源

返回一个字符串,其中包含 RFC-2045 兼容的 Base64 编码字符串 str 的解码。

s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
Base64.decode64(s) # => "This is line 1\nThis is line 2\n"

str 中的非 Base64 字符将被忽略;请参阅上面的 编码字符集:其中包括换行符和字符 -/

Base64.decode64("\x00\n-_") # => ""

str 中的填充(即使不正确)也会被忽略

Base64.decode64("MDEyMzQ1Njc")   # => "01234567"
Base64.decode64("MDEyMzQ1Njc=")  # => "01234567"
Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
# File lib/base64.rb, line 241
def decode64(str)
  str.unpack1("m")
end
encode64(bin) 单击以切换源

返回一个字符串,其中包含 bin 的 RFC-2045 兼容的 Base64 编码。

根据 RFC 2045,返回的字符串可能包含 URL 不安全的字符 +/;请参阅上面的 编码字符集

Base64.encode64("\xFB\xEF\xBE") # => "++++\n"
Base64.encode64("\xFF\xFF\xFF") # => "////\n"

返回的字符串可能包括填充;请参阅上面的 填充

Base64.encode64('*') # => "Kg==\n"

返回的字符串以换行符结尾,如果足够长,将有一个或多个嵌入式换行符;请参阅上面的 换行符

Base64.encode64('*') # => "Kg==\n"
Base64.encode64('*' * 46)
# => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq\nKg==\n"

要编码的字符串本身可能包含换行符,这些换行符将作为普通 Base64 编码

Base64.encode64("\n\n\n") # => "CgoK\n"
s = "This is line 1\nThis is line 2\n"
Base64.encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n"
# File lib/base64.rb, line 219
def encode64(bin)
  [bin].pack("m")
end
strict_decode64(str) 单击以切换源

返回一个字符串,其中包含 RFC-2045 兼容的 Base64 编码字符串 str 的解码。

s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
Base64.strict_decode64(s) # => "This is line 1\nThis is line 2\n"

str 中不允许的非 Base64 字符;请参阅上面的 编码字符集:其中包括换行符和字符 -/

Base64.strict_decode64("\n") # Raises ArgumentError
Base64.strict_decode64('-')  # Raises ArgumentError
Base64.strict_decode64('_')  # Raises ArgumentError

如果存在,str 中的填充必须正确

Base64.strict_decode64("MDEyMzQ1Njc")   # Raises ArgumentError
Base64.strict_decode64("MDEyMzQ1Njc=")  # => "01234567"
Base64.strict_decode64("MDEyMzQ1Njc==") # Raises ArgumentError
# File lib/base64.rb, line 297
def strict_decode64(str)
  str.unpack1("m0")
end
strict_encode64(bin) 单击以切换源

返回一个字符串,其中包含 bin 的 RFC-2045 兼容的 Base64 编码。

根据 RFC 2045,返回的字符串可能包含 URL 不安全的字符 +/;请参阅上面的 编码字符集

Base64.strict_encode64("\xFB\xEF\xBE") # => "++++\n"
Base64.strict_encode64("\xFF\xFF\xFF") # => "////\n"

返回的字符串可能包括填充;请参阅上面的 填充

Base64.strict_encode64('*') # => "Kg==\n"

返回的字符串将没有换行符,无论其长度如何;请参见上面的 换行符

Base64.strict_encode64('*') # => "Kg=="
Base64.strict_encode64('*' * 46)
# => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="

要编码的字符串本身可能包含换行符,这些换行符将作为普通 Base64 编码

Base64.strict_encode64("\n\n\n") # => "CgoK"
s = "This is line 1\nThis is line 2\n"
Base64.strict_encode64(s) # => "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK"
# File lib/base64.rb, line 273
def strict_encode64(bin)
  [bin].pack("m0")
end
urlsafe_decode64(str) 单击以切换源

返回 RFC-4648 兼容 Base64 编码字符串 str 的解码

str 可能不包含非 Base64 字符;请参见上面的 编码字符集

Base64.urlsafe_decode64('+')  # Raises ArgumentError.
Base64.urlsafe_decode64('/')  # Raises ArgumentError.
Base64.urlsafe_decode64("\n") # Raises ArgumentError.

如果存在,str 中的填充必须正确:请参见上面的 填充

Base64.urlsafe_decode64("MDEyMzQ1Njc") # => "01234567"
Base64.urlsafe_decode64("MDEyMzQ1Njc=") # => "01234567"
Base64.urlsafe_decode64("MDEyMzQ1Njc==") # Raises ArgumentError.
# File lib/base64.rb, line 351
def urlsafe_decode64(str)
  # NOTE: RFC 4648 does say nothing about unpadded input, but says that
  # "the excess pad characters MAY also be ignored", so it is inferred that
  # unpadded input is also acceptable.
  if !str.end_with?("=") && str.length % 4 != 0
    str = str.ljust((str.length + 3) & ~3, "=")
    str.tr!("-_", "+/")
  else
    str = str.tr("-_", "+/")
  end
  strict_decode64(str)
end
urlsafe_encode64(bin, padding: true) 单击以切换源

返回 bin 的 RFC-4648 兼容 Base64 编码。

根据 RFC 4648,返回的字符串将不包含 URL 不安全的字符 +/,但可能包含 URL 安全的字符 -_;请参见上面的 编码字符集

Base64.urlsafe_encode64("\xFB\xEF\xBE") # => "----"
Base64.urlsafe_encode64("\xFF\xFF\xFF") # => "____"

默认情况下,返回的字符串可能带有填充;请参见上面的 填充

Base64.urlsafe_encode64('*') # => "Kg=="

或者,您可以取消填充

Base64.urlsafe_encode64('*', padding: false) # => "Kg"

返回的字符串将没有换行符,无论其长度如何;请参见上面的 换行符

Base64.urlsafe_encode64('*') # => "Kg=="
Base64.urlsafe_encode64('*' * 46)
# => "KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg=="
# File lib/base64.rb, line 328
def urlsafe_encode64(bin, padding: true)
  str = strict_encode64(bin)
  str.chomp!("==") or str.chomp!("=") unless padding
  str.tr!("+/", "-_")
  str
end