base64 encoding takes 8-bit binary byte data and encodes it uses only the characters A-Z, a-z, 0-9, +, /* so it can be transmitted over channels that do not preserve all 8-bits of data, such as email.

Hence, it wants a string of 8-bit bytes. You create those in Python 3 with the b'' syntax.

If you remove the b, it becomes a string. A string is a sequence of Unicode characters. base64 has no idea what to do with Unicode data, it's not 8-bit. It's not really any bits, in fact. :-)

In your second example:

>>> encoded = base64.b64encode('data to be encoded')

All the characters fit neatly into the ASCII character set, and base64 encoding is therefore actually a bit pointless. You can convert it to ascii instead, with

>>> encoded = 'data to be encoded'.encode('ascii')

Or simpler:

>>> encoded = b'data to be encoded'

Which would be the same thing in this case.


* Most base64 flavours may also include a = at the end as padding. In addition, some base64 variants may use characters other than + and /. See the Variants summary table at Wikipedia for an overview.

Answer from Lennart Regebro on Stack Overflow
🌐
Python
docs.python.org › 3 › library › base64.html
base64 — Base16, Base32, Base64, Base85 Data Encodings
This module provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data. This includes the encodings specified in RFC 4648 (Base64, Base32 and Base16), the Base85 encoding specified ...
🌐
GeeksforGeeks
geeksforgeeks.org › python › encoding-and-decoding-base64-strings-in-python
Encoding and Decoding Base64 Strings in Python - GeeksforGeeks
August 7, 2024 - The below image provides us with a Base64 encoding table. ... In Python the base64 module is used to encode and decode data. First, the strings are converted into byte-like objects and then encoded using the base64 module.
Top answer
1 of 5
363

base64 encoding takes 8-bit binary byte data and encodes it uses only the characters A-Z, a-z, 0-9, +, /* so it can be transmitted over channels that do not preserve all 8-bits of data, such as email.

Hence, it wants a string of 8-bit bytes. You create those in Python 3 with the b'' syntax.

If you remove the b, it becomes a string. A string is a sequence of Unicode characters. base64 has no idea what to do with Unicode data, it's not 8-bit. It's not really any bits, in fact. :-)

In your second example:

>>> encoded = base64.b64encode('data to be encoded')

All the characters fit neatly into the ASCII character set, and base64 encoding is therefore actually a bit pointless. You can convert it to ascii instead, with

>>> encoded = 'data to be encoded'.encode('ascii')

Or simpler:

>>> encoded = b'data to be encoded'

Which would be the same thing in this case.


* Most base64 flavours may also include a = at the end as padding. In addition, some base64 variants may use characters other than + and /. See the Variants summary table at Wikipedia for an overview.

2 of 5
252

Short Answer

You need to push a bytes-like object (bytes, bytearray, etc) to the base64.b64encode() method. Here are two ways:

>>> import base64
>>> data = base64.b64encode(b'data to be encoded')
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'

Or with a variable:

>>> import base64
>>> string = 'data to be encoded'
>>> data = base64.b64encode(string.encode())
>>> print(data)
b'ZGF0YSB0byBiZSBlbmNvZGVk'

Why?

In Python 3, str objects are not C-style character arrays (so they are not byte arrays), but rather, they are data structures that do not have any inherent encoding. You can encode that string (or interpret it) in a variety of ways. The most common (and default in Python 3) is utf-8, especially since it is backwards compatible with ASCII (although, as are most widely-used encodings). That is what is happening when you take a string and call the .encode() method on it: Python is interpreting the string in utf-8 (the default encoding) and providing you the array of bytes that it corresponds to.

Base-64 Encoding in Python 3

Originally the question title asked about Base-64 encoding. Read on for Base-64 stuff.

base64 encoding takes 6-bit binary chunks and encodes them using the characters A-Z, a-z, 0-9, '+', '/', and '=' (some encodings use different characters in place of '+' and '/'). This is a character encoding that is based off of the mathematical construct of radix-64 or base-64 number system, but they are very different. Base-64 in math is a number system like binary or decimal, and you do this change of radix on the entire number, or (if the radix you're converting from is a power of 2 less than 64) in chunks from right to left.

In base64 encoding, the translation is done from left to right; those first 64 characters are why it is called base64 encoding. The 65th '=' symbol is used for padding, since the encoding pulls 6-bit chunks but the data it is usually meant to encode are 8-bit bytes, so sometimes there are only two or 4 bits in the last chunk.

Example:

>>> data = b'test'
>>> for byte in data:
...     print(format(byte, '08b'), end=" ")
...
01110100 01100101 01110011 01110100
>>>

If you interpret that binary data as a single integer, then this is how you would convert it to base-10 and base-64 (table for base-64):

base-2:  01 110100 011001 010111 001101 110100 (base-64 grouping shown)
base-10:                            1952805748
base-64:  B      0      Z      X      N      0

base64 encoding, however, will re-group this data thusly:

base-2:  011101  000110  010101 110011 011101 00(0000) <- pad w/zeros to make a clean 6-bit chunk
base-10:     29       6      21     51     29      0
base-64:      d       G       V      z      d      A

So, 'B0ZXN0' is the base-64 version of our binary, mathematically speaking. However, base64 encoding has to do the encoding in the opposite direction (so the raw data is converted to 'dGVzdA') and also has a rule to tell other applications how much space is left off at the end. This is done by padding the end with '=' symbols. So, the base64 encoding of this data is 'dGVzdA==', with two '=' symbols to signify two pairs of bits will need to be removed from the end when this data gets decoded to make it match the original data.

Let's test this to see if I am being dishonest:

>>> encoded = base64.b64encode(data)
>>> print(encoded)
b'dGVzdA=='

Why use base64 encoding?

Let's say I have to send some data to someone via email, like this data:

>>> data = b'\x04\x6d\x73\x67\x08\x08\x08\x20\x20\x20'
>>> print(data.decode())
   
>>> print(data)
b'\x04msg\x08\x08\x08   '
>>>

There are two problems I planted:

  1. If I tried to send that email in Unix, the email would send as soon as the \x04 character was read, because that is ASCII for END-OF-TRANSMISSION (Ctrl-D), so the remaining data would be left out of the transmission.
  2. Also, while Python is smart enough to escape all of my evil control characters when I print the data directly, when that string is decoded as ASCII, you can see that the 'msg' is not there. That is because I used three BACKSPACE characters and three SPACE characters to erase the 'msg'. Thus, even if I didn't have the EOF character there the end user wouldn't be able to translate from the text on screen to the real, raw data.

This is just a demo to show you how hard it can be to simply send raw data. Encoding the data into base64 format gives you the exact same data but in a format that ensures it is safe for sending over electronic media such as email.

🌐
W3Schools
w3schools.com › python › ref_module_base64.asp
Python base64 Module
Python Examples Python Compiler Python Exercises Python Quiz Python Challenges Python Practice Problems Python Server Python Syllabus Python Study Plan Python Interview Q&A Python Training ... import base64 s = "Linus".encode() b = base64.b64encode(s) print(b) print(base64.b64decode(b).decode()) Try it Yourself »
🌐
Real Python
realpython.com › ref › stdlib › base64
base64 | Python Standard Library – Real Python
Encoding and decoding with the standard Base64 alphabet: ... >>> import base64 >>> base64.b64encode(b"Python is great") b'UHl0aG9uIGlzIGdyZWF0' >>> base64.b64decode(b"UHl0aG9uIGlzIGdyZWF0") b'Python is great'
🌐
Base64Encode.org
base64encode.org › enc › python
Base64 Encoding of "python" - Online
Encode python to Base64 format with various advanced options. Our site has an easy to use online tool to convert your data.
Find elsewhere
🌐
GitHub
github.com › mayeut › pybase64
GitHub - mayeut/pybase64: Fast Base64 encoding/decoding in Python · GitHub
It aims to provide a fast base64 implementation for base64 encoding/decoding. ... pybase64 uses the same API as Python base64 "modern interface" (introduced in Python 2.4) for an easy integration.
Author: mayeut
🌐
GitHub
gist.github.com › juliensalinas › 15789d241f28b1ce45f0c22e11ba894a
Encoding a file in base 64 in Python · GitHub
Encoding a file in base 64 in Python · Raw · base64_encode.py · This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
🌐
Medium
medium.com › @ume.cooray › understanding-base64-encoding-in-python-5b31f23dd007
Understanding Base64 Encoding and Decoding in Python | by Umayangana Cooray | Medium
March 18, 2025 - import base64 import json # Example JSON token (as a string) json_token = "" # Step 1: Convert the JSON string to bytes json_bytes = json_token.encode('utf-8') # Step 2: Encode the bytes using Base64 base64_bytes = base64.b64encode(json_bytes) ...
🌐
Reddit
reddit.com › r/learnpython › base 64 encode python files!
r/learnpython on Reddit: Base 64 Encode Python Files!
October 20, 2018 -
import base64, os
path = ""
path2 = ""
flag = False
while not os.path.isfile(path):
    if flag:
        print("File path does not exist!\n")
    path = input("Enter path to python file to base64 encode: ")
    flag = True
    
path2 = input("Enter path to save base64 encoded python file: ")
if os.path.isfile(path):
    contentb64 = ""
    with open(path, "r") as file:
        content = file.read()
        contentb64 = base64.b64encode(content.encode()).decode()

    contentb64 = 'import base64; exec(base64.b64decode(b"%s").decode())' % contentb64
    with open(path2, "w") as file:
        file.write(contentb64)

    print("dOnE!")
    input(); exit()

Base 64 encodes python code, can be useful if you don't want people to see your code, just modify this one to do it multiple times as you wish.

🌐
Stack Abuse
stackabuse.com › encoding-and-decoding-base64-strings-in-python
Encoding and Decoding Base64 Strings in Python
September 4, 2023 - Without using 'rb', Python would assume we are reading a text file. We then use the read() method to get all the data in the file into the binary_file_data variable. Similar to how we treated strings, we Base64 encoded the bytes with base64.b64encode and then used the decode('utf-8') on base64_encoded_data to get the Base64 encoded data using human-readable characters.
🌐
Python Engineer
python-engineer.com › posts › base64-module
The base64 Module in Python - Python Engineer
June 21, 2022 - The base64 module provides the b64encode() function. It encodes a bytes-like object using Base64 and returns the encoded bytes.
🌐
iO Flood
ioflood.com › blog › python-base64-encode
Python Base64 Encode | b64encode() Function Guide
February 1, 2024 - The b64encode() function is suitable for general purpose base64 encoding, while urlsafe_b64encode() is ideal when you need to include the encoded data in a URL. In conclusion, Python’s base64 module offers a variety of methods for base64 encoding to cater to different needs.
🌐
DEV Community
dev.to › atifwattoo › what-is-base64-string-in-python-4joo
What is base64 string in Python? - DEV Community
December 23, 2024 - import base64 # Encode a string to base64 data = "Hello, World!" encoded = base64.b64encode(data.encode()) print(encoded) # Output: b'SGVsbG8sIFdvcmxkIQ==' # Decode a base64 string decoded = base64.b64decode(encoded).decode() print(decoded) # Output: "Hello, World!"
🌐
Yossarian
yossarian.net › til › post › python-s-base64-encodebytes-has-surprising-behavior
TIL: Python's base64.encodebytes has surprising behavior
September 19, 2024 - Encode the bytes-like object s, which can contain arbitrary binary data, and return bytes containing the base64-encoded data, with newlines (b'\n') inserted after every 76 bytes of output, and ensuring that there is a trailing newline, as per RFC 2045 (MIME).
🌐
Base64.Guru
base64.guru › converter › encode › file
File to Base64 | Base64 Encode | Base64 Converter | Base64
Encode file to Base64 online and embed it into any text document such as HTML, JSON, or XML. The fact is that if you do not convert binary to Base64, you won’t be able to insert such data into text files, because binary characters will corrupt text data. It is important to remember that the ...
🌐
Ocaso3D
b64encode.com › blog › base64-in-python
Encoding and Decoding with Base64 in Python - B64Encode
December 28, 2023 - The module’s ease of use and ... module in Python includes two main functions, the b64encode() function accepts binary data and returns the Base64-encoded version as bytes....
🌐
Homebrew
formulae.brew.sh › formula
Homebrew Formulae: homebrew-core
July 7, 2026 - This is a listing of all packages available from the core tap via the Homebrew package manager for macOS and Linux
🌐
Reddit
reddit.com › r/learnpython › python base64 encode
r/learnpython on Reddit: Python Base64 Encode
May 20, 2018 -

I apologize for not really knowing what I'm asking for. I know what I want to get to, but not really how to even ask how to get there.

I'm trying to create a python function to calculate base64(sha256(utf16le(username))) as implemented by Microsoft in some RDP logs. The sha256(utf16le(username)) part is easy, it's basically the python NTLM function, but using sha256 instead of MD5.

The part I can't get past is where the base64 calculation comes in. Microsoft calculates the base64 value of the hash (in my example, hash= b3cbfbc12d543247349b2cad1885de5f631687da23a62e1a2b04706cec054b95) as s8v7wS1UMkc0myytGIXeX2MWh9ojpi4aKwRwbOwFS5U=. A Go implementation that calculates it correctly is here: https://play.golang.org/p/6EH64HJBVzr

Bash base64 and Python however calculate the hash as YjNjYmZiYzEyZDU0MzI0NzM0OWIyY2FkMTg4NWRlNWY2MzE2ODdkYTIzYTYyZTFhMmIwNDcwNmNlYzA1NGI5NQ==, I can also get Go to calculate the same hash, though I don't know why: https://play.golang.org/p/-yZPjBBFGy1

I'd like to understand why I'm getting two different hash values and what the difference between those two is. I'd also love to know how to get the correct (correct for my case anyway) hash out of Python.

🌐
Cloudinary
cloudinary.com › home › image conversion to base64 in python: a comprehensive guide
Image Conversion to Base64 in Python: A Comprehensive Guide | Cloudinary
April 24, 2026 - Alternatively, you can convert images to Base64 directly in Python with the Base64 package included in the Python Standard Library. Here’s an example: import base64 def convert_image_to_base64(image_path): """This takes a file path and returns ...