Base64 Encoding in Ruby

Ruby's Base64 module provides methods for encoding and decoding.

Basic Usage

Encode to Base64

require 'base64'

text = "Hello, World!"
encoded = Base64.encode64(text)
puts encoded # "SGVsbG8sIFdvcmxkIQ==\n"

Decode from Base64

require 'base64'

encoded = "SGVsbG8sIFdvcmxkIQ=="
decoded = Base64.decode64(encoded)
puts decoded # "Hello, World!"

Strict Encoding (No Line Breaks)

Use strict_encode64 for output without line breaks:

require 'base64'

text = "Hello, World!"
encoded = Base64.strict_encode64(text)
puts encoded # "SGVsbG8sIFdvcmxkIQ=="

decoded = Base64.strict_decode64(encoded)
puts decoded # "Hello, World!"

URL-Safe Base64

Use urlsafe_encode64 for URL-safe encoding:

require 'base64'

text = "Hello, World!"

# With padding
encoded = Base64.urlsafe_encode64(text)
puts encoded

# Without padding
encoded_no_pad = Base64.urlsafe_encode64(text, padding: false)
puts encoded_no_pad

# Decode
decoded = Base64.urlsafe_decode64(encoded)
puts decoded

File to Base64

Encode a File

require 'base64'

content = File.binread('image.png')
encoded = Base64.strict_encode64(content)
puts encoded

Decode to File

require 'base64'

encoded = "iVBORw0KGgo..." # Base64 string
decoded = Base64.strict_decode64(encoded)
File.binwrite('output.png', decoded)

Data URL

Create a Data URL from a file:

require 'base64'
require 'marcel' # gem install marcel

def file_to_data_url(filepath)
  content = File.binread(filepath)
  mime = Marcel::MimeType.for(Pathname.new(filepath))
  encoded = Base64.strict_encode64(content)
  "data:#{mime};base64,#{encoded}"
end

puts file_to_data_url('image.png')

One-Liner

# Encode
ruby -rbase64 -e "puts Base64.strict_encode64('Hello')"

# Decode
ruby -rbase64 -e "puts Base64.strict_decode64('SGVsbG8=')"

Pack/Unpack Alternative

Ruby's pack/unpack can also do Base64:

# Encode
encoded = ["Hello, World!"].pack('m0')
puts encoded # "SGVsbG8sIFdvcmxkIQ=="

# Decode
decoded = "SGVsbG8sIFdvcmxkIQ==".unpack1('m0')
puts decoded # "Hello, World!"

Rails Helper

In Rails, you can also use:

# In views or helpers
<%= base64_encode("Hello") %>

# For images
<%= image_tag("data:image/png;base64,#{Base64.strict_encode64(File.binread('image.png'))}")%>

Handling Binary Data

require 'base64'

# Ensure binary encoding
binary_data = "\x00\x01\x02\x03".force_encoding('BINARY')
encoded = Base64.strict_encode64(binary_data)
decoded = Base64.strict_decode64(encoded)

puts decoded.bytes.inspect # [0, 1, 2, 3]