Skip to main content

Discrete Mathematical Structures

Subsection 5.2.2 Text encoding

The American Standard Code for Information Interchange (ASCII) is a standard way to represent characters as numbers. For example, a space is represented by 32, a comma is 44, and a period is 46. The capital letters are also 2 digit integers, starting with 65 for A and going to 90 for Z. The Python functions chr and ord to convert the ASCII to characters. e.g., chr(66) returns the string A. If we want to go the other way, ord('A') returns the integer 65. This is known as encoding.
We list the printable ASCII with codes from 32 to 126.
Listing 5.2.2.1. Printables ASCII characters
for x in range(32,127): 
print(x,":",chr(x),"  ",end="")

Example 5.2.2.2. ASCII characters and codes.

Listing 5.2.2.1 above prints:
 32 :     33 : !   34 : "   35 : #   36 : $   37 : %   38 : &   39 : '   
 40 : (   41 : )   42 : *   43 : +   44 : ,   45 : -   46 : .   47 : /   
 48 : 0   49 : 1   50 : 2   51 : 3   52 : 4   53 : 5   54 : 6   55 : 7   
 56 : 8   57 : 9   58 : :   59 : ;   60 : <   61 : =   62 : >   63 : ?   
 64 : @   65 : A   66 : B   67 : C   68 : D   69 : E   70 : F   71 : G   
 72 : H   73 : I   74 : J   75 : K   76 : L   77 : M   78 : N   79 : O   
 80 : P   81 : Q   82 : R   83 : S   84 : T   85 : U   86 : V   87 : W   
 88 : X   89 : Y   90 : Z   91 : [   92 : \   93 : ]   94 : ^   95 : _   
 96 : `   97 : a   98 : b   99 : c  100 : d  101 : e  102 : f  103 : g   
104 : h  105 : i  106 : j  107 : k  108 : l  109 : m  110 : n  111 : o  
112 : p  113 : q  114 : r  115 : s  116 : t  117 : u  118 : v  119 : w  
120 : x  121 : y  122 : z  123 : {  124 : |  125 : }  126 : ~
In order to encode messages longer than one character, we will view each number as a digit in a base \(256\) expansion of an integer \(M\text{.}\)

Example 5.2.2.3. Text encoding.

Suppose I want to encode the message Help! using ASCII. We have \(\ord(H) = 72\text{,}\) \(\ord(e) = 101\text{,}\) \(\ord(l) = 108\text{,}\) \(\ord(p) = 112\text{,}\) \(\ord(!) = 33\text{.}\) Wo the encoded message is
\begin{equation*} M = (72, 101, 108, 112, 33)_{256}. \end{equation*}
That means
\begin{align*} M \amp=72 \cdot 256^{4} + 101 \cdot 256^3 + 108 \cdot 256^2 + 112 \cdot 256^1 + 33 \cdot 256^0\\ \amp= 310939250721. \end{align*}

Remark 5.2.2.4.

ASCII allows use to convert messages written as strings into sequences of integers. We take this a step further interpreting the sequence as the base \(256\) expansion of a single integer. We will use this later when we look at RSA encryption Subsection 5.5.4.

Example 5.2.2.5. Text decoding.

We can decode a message by computing the base 256 expansion of the encoded message and decoding each character. For example, suppose the encoded message is \(M = {310939249775}\text{.}\) The base 256 expansion of \(M\) is
\begin{equation*} M = (72, 101, 108, 108, 111)_{256}. \end{equation*}
Then \(\chr(72) = H\text{,}\) \(\chr(101) = e\text{,}\) \(\chr(108) = l\text{,}\) \(\chr(108) = l\text{,}\) \(\chr(111) = o\text{.}\)
So the decoded message is `Hello’.
Watch the video https://youtu.be/23J2doHaJ6U for additional details about implementation.
Figure 5.2.2.6. Code Talkers. (https://xkcd.com/257/) As far as I can tell, Navajo doesn’t have a common word for `zero’. do-neh-lini means `neutral’.