Модуль Base64
Модуль Base64 предоставляет методы для:
-
Encodingдвоичной строки (содержащей символы, не из ASCII) в строку печатаемых символов ASCII. -
Декодирования такой закодированной строки.
Base64 часто используется в контекстах, где двоичные данные не разрешены или не поддерживаются:
-
Изображения в файлах HTML или CSS, или в URL.
-
Вложения электронной почты.
Строка, закодированная в Base64, примерно на одну треть больше исходной. См. статью Википедии для получения дополнительной информации.
Этот модуль предоставляет три пары методов кодирования/декодирования. Ваш выбор среди этих методов должен зависеть от:
-
Какой набор символов будет использоваться для кодирования и декодирования.
-
Используется ли «заполнение».
-
Будут ли закодированные строки содержать новые строки.
Примечание: примеры на этой странице предполагают, что включающая программа выполнила:
require 'base64'
Encoding Наборы символов
Закодированная в Base64 строка состоит только из символов из набора из 64 символов:
-
('A'..'Z'). -
('a'..'z'). -
('0'..'9'). -
=, символ «заполнения». -
Либо:
-
%w[+ /]: совместимый с RFC-2045; не безопасен для URL. -
%w[- _]: совместимый с RFC-4648; безопасен для URL.
-
Если вы работаете со строками, закодированными в Base64, которые будут получены из или помещены в URL, вы должны выбрать эту пару методов, совместимых с RFC-4648:
В противном случае, вы можете выбрать любую пару в этом модуле, включая пару выше, или пары, совместимые с RFC-2045:
Заполнение
Кодирование Base64 изменяет тройку входных байтов на квартет выходных символов.
Заполнение в методах кодирования
Заполнение – расширение закодированной строки нулем, одним или двумя trailing = символами – выполняется методами Base64.encode64, Base64.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 – неотрицательное целое число:
-
Входные байты длиной 3n генерируют незаполненные выходные символы длиной 4n:
# n = 1: 3 bytes => 4 characters. Base64.strict_encode64('123') # => "MDEy" # n = 2: 6 bytes => 8 characters. Base64.strict_encode64('123456') # => "MDEyMzQ1" -
Входные байты длиной 3n+1 генерируют заполненные выходные символы длиной 4(n+1) с двумя символами заполнения в конце:
# n = 1: 4 bytes => 8 characters. Base64.strict_encode64('1234') # => "MDEyMw==" # n = 2: 7 bytes => 12 characters. Base64.strict_encode64('1234567') # => "MDEyMzQ1Ng==" -
Входные байты длиной 3n+2 генерируют заполненные выходные символы длиной 4(n+1) с одним символом заполнения в конце:
# n = 1: 5 bytes => 8 characters. Base64.strict_encode64('12345') # => "MDEyMzQ=" # n = 2: 8 bytes => 12 characters. Base64.strict_encode64('12345678') # => "MDEyMzQ1Njc="
Когда заполнение подавлено, для положительного целого числа n:
-
Входные байты длиной 3n генерируют незаполненные выходные символы длиной 4n:
# n = 1: 3 bytes => 4 characters. Base64.urlsafe_encode64('123', padding: false) # => "MDEy" # n = 2: 6 bytes => 8 characters. Base64.urlsafe_encode64('123456', padding: false) # => "MDEyMzQ1" -
Входные байты длиной 3n+1 генерируют незаполненные выходные символы длиной 4n+2 с двумя символами заполнения в конце:
# n = 1: 4 bytes => 6 characters. Base64.urlsafe_encode64('1234', padding: false) # => "MDEyMw" # n = 2: 7 bytes => 10 characters. Base64.urlsafe_encode64('1234567', padding: false) # => "MDEyMzQ1Ng" -
Входные байты длиной 3n+2 генерируют незаполненные выходные символы длиной 4n+3 с одним символом заполнения в конце:
# n = 1: 5 bytes => 7 characters. Base64.urlsafe_encode64('12345', padding: false) # => "MDEyMzQ" # m = 2: 8 bytes => 11 characters. Base64.urlsafe_encode64('12345678', padding: false) # => "MDEyMzQ1Njc"
Заполнение в методах декодирования
Все методы декодирования 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.encode64 или Base64.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
Открытые методы экземпляров
# File lib/base64.rb, line 241
def decode64(str)
str.unpack1("m")
end Возвращает строку, содержащую декодирование строки, закодированной в формате Base64, совместимом со спецификацией RFC-2045. str:
s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK\n" Base64.decode64(s) # => "This is line 1\nThis is line 2\n"
Символы, не являющиеся символами Base64 в str, игнорируются; см. Набор символов кодирования выше: сюда входят символы новой строки и символы - и /:
Base64.decode64("\x00\n-_") # => ""
Заполнение в str (даже если оно некорректно) игнорируется:
Base64.decode64("MDEyMzQ1Njc") # => "01234567"
Base64.decode64("MDEyMzQ1Njc=") # => "01234567"
Base64.decode64("MDEyMzQ1Njc==") # => "01234567"
# File lib/base64.rb, line 219
def encode64(bin)
[bin].pack("m")
end Возвращает строку, содержащую кодирование строки в формате Base64, совместимом со спецификацией RFC-2045, bin.
Согласно 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 297
def strict_decode64(str)
str.unpack1("m0")
end Возвращает строку, содержащую декодирование строки, закодированной в формате Base64, совместимом со спецификацией RFC-2045. str:
s = "VGhpcyBpcyBsaW5lIDEKVGhpcyBpcyBsaW5lIDIK" Base64.strict_decode64(s) # => "This is line 1\nThis is line 2\n"
Символы, не являющиеся символами Base64 в str, недопустимы; см. Набор символов кодирования выше: сюда входят символы новой строки и символы - и /:
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 273
def strict_encode64(bin)
[bin].pack("m0")
end Возвращает строку, содержащую кодирование строки в формате Base64, совместимом со спецификацией RFC-2045, bin.
Согласно 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 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 Возвращает декодирование строки, закодированной в формате Base64, совместимом со спецификацией RFC-4648. 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 328
def urlsafe_encode64(bin, padding: true)
str = strict_encode64(bin)
str.chomp!("==") or str.chomp!("=") unless padding
str.tr!("+/", "-_")
str
end Возвращает кодирование строки в формате Base64, совместимом со спецификацией RFC-4648, bin.
Согласно 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=="
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.