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