Introduction
What would the world be without electronic communication? In the fourth Industrial Revolution, everything is centered around data. For data to be so valuable, it needs to be input electronically. This is where ASCII comes in. Today, you will learn about ASCII and how to create your own ASCII table in .NET.
ASCII
American Standard Code for Information Interchange, ASCII, is a character encoding standard for electronic communication. ASCII codes represent electronic text in computers and telecommunications equipment.
Practical
Start Visual Studio and create either a Visual Basic.NET or C# Windows Forms project. Once the project has loaded, resize the form to increase its size and add a Docked RichTexBox to your form. The RichTextBox will be used to display your ASCII Table.
Add a Class and name it clsASCII. Remember that my naming of objects may differ from yours. Import the proper Namespaces so that it is easier to make use of the objects in the respective .NET classes.
C#
using System; using System.Collections.Generic; using System.Text;
VB.NET
Imports System.Text
Add an Enumeration for the characters that aren’t printed. These are the the non-printing characters.
C#
enum NonPrintingChars { NUL, // Null character// SOH, // Start of Header// STX, // Start of Text// ETX, // End of Text// EOT, // End of Transmission// ENQ, // Enquiry// ACK, // Acknowledgment// BEL, // Bell// BS, // Backspace// HT, // Horizontal Tab// LF, // Line feed// VT, // Vertical Tab// FF, // Form feed// CR, // Carriage return// SO, // Shift Out// SI, // Shift In// DLE, // Data Link Escape// DC1, // Device Control 1// DC2, // Device Control 2// DC3, // Device Control 3 // DC4, // Device Control 4// NAK, // Negative Acknowledgement// SYN, // Synchronous idle// ETB, // End of Transmission Block// CAN, // Cancel// EM, // End of Medium// S_B, // SUB Substitute// ESC, // Escape// FS, // File Separator// GS, // Group Separator// RS, // Record Separator// US, // Unit Separator// SPC, // Space// DEL = 127, // Delete// SHYP = 173, // Soft Hyphen// NBSP = 255, // NBSP// }
VB.NET
Enum NonPrintingChars NUL ' Null character' SOH ' Start of Header' STX ' Start of Text' ETX ' End of Text' EOT ' End of Transmission' ENQ ' Enquiry' ACK ' Acknowledgment' BEL ' Bell' BS ' Backspace' HT ' Horizontal Tab' LF ' Line feed' VT ' Vertical Tab' FF ' Form feed' CR ' Carriage return' SO ' Shift Out' SI ' Shift In' DLE ' Data Link Escape' DC1 ' Device Control 1' DC2 ' Device Control 2' DC3 ' Device Control 3' DC4 ' Device Control 4' NAK ' Negative Acknowledgement' SYN ' Synchronous idle' ETB ' End of Transmission Block' CAN ' Cancel' EM ' End of Medium' S_B ' SUB Substitute' ESC ' Escape' FS ' File Separator' GS ' Group Separator' RS ' Record Separator' US ' Unit Separator' SPC ' Space' DEL = 127 ' Delete' SHYP = 173 ' Soft Hyphen' NBSP = 255 'NBSP' End Enum
Add the Class’ fields and Properties.
C#
public Dictionary<int, Characters> dicChars { get; set; } = new Dictionary<int, Characters>(); private NonPrintingChars[] npcNonPrintingCharcaters = (NonPrintingChars[])Enum.GetValues(typeof(NonPrintingChars)); private StringBuilder sbTable = new StringBuilder(); private Encoding encEncoding; public Encoding EncodingType { get { return encEncoding; } set { encEncoding = value; for (int i = 0; i <= 255; i++) { Characters chrCurrent = new Characters(i, ShowCharacter(i)); dicChars.Add(i, chrCurrent); } } }
VB.NET
Property dicChars As New Dictionary(Of Integer, Characters) Private npcNonPrintingCharcaters() As NonPrintingChars =_ CType([Enum].GetValues(GetType(NonPrintingChars)), _ NonPrintingChars()) Private sbTable As New StringBuilder Private encEncoding As Encoding Public Property EncodingType() As Encoding Get Return encEncoding End Get Set(ByVal value As Encoding) encEncoding = value For i As Integer = 0 To 255 Dim chrCurrent As New Characters(i, ShowCharacter(i)) dicChars.Add(i, chrCurrent) Next End Set End Property
diChars is a Dictionary object that will hold the characters. ncpNonPrintingCharacters is a representation of the NonPrintingChars Enum. sbTable is a StringBuilder object that will end up being the ASCII Table. encEncoding is of type Encoding, which will handle the character encoding. Add the rest of the class.
C#
public clsASCII() { EncodingType = Encoding.Default; } private void CreateRows(int intStartPos) { for (int i = 0; i <= 31; i++) { for (int j = intStartPos; j <= intStartPos + 96; j += 32) { int chCurrent = i + j; Characters chrCharacter = dicChars[chCurrent]; sbTable.Append(string.Format(" {0} {1} x{2} o{3} |", chrCharacter.Character, chrCharacter.Decimal, chrCharacter.Hexadecimal, chrCharacter.Octal)); } sbTable.AppendLine(); } } public string CreateTable(bool blnAll) { sbTable.Clear(); for (int i = 1; i <= 4; i++) sbTable.Append(string.Format(" {0} {1} {2} {3} |", "Char", "Dec", "Hex", "Oct")); sbTable.AppendLine(); CreateRows(0); if (blnAll) { sbTable.AppendLine(); CreateRows(128); } return sbTable.ToString(); } private string ShowCharacter(int intCode) { return (char)255 + ((NonPrintingChars)intCode).ToString() .Replace('_', 'U'); }
VB.NET
Public Sub New() EncodingType = Encoding.Default End Sub Private Sub CreateRows(intStartPos As Integer) For i As Integer = 0 To 31 For j As Integer = intStartPos To intStartPos + 96 _ Step 32 Dim chCurrent As Integer = i + j Dim chrCharacter As Characters = dicChars(chCurrent) sbTable.Append(String.Format(" {0} {1} x{2} o{3} |", _ chrCharacter.Character, chrCharacter.Decimal, _ chrCharacter.Hexadecimal, chrCharacter.Octal)) Next sbTable.AppendLine() Next End Sub Public Function CreateTable(blnAll As Boolean) As String sbTable.Clear() For i As Integer = 1 To 4 sbTable.Append(String.Format(" {0} {1} {2} {3} |", _ "Char", "Dec", "Hex", "Oct")) Next sbTable.AppendLine() CreateRows(0) If blnAll Then sbTable.AppendLine() CreateRows(128) End If Return sbTable.ToString End Function Private Function ShowCharacter(intCode As Integer) As String If npcNonPrintingCharcaters.Contains(DirectCast(intCode, _ NonPrintingChars)) Then Return Chr(255) & DirectCast(intCode, NonPrintingChars) _ .ToString.Replace("_"c, "U"c) Else Dim bTemp(0) As Byte bTemp(0) = CByte(intCode) Return EncodingType.GetChars(bTemp) End If End Function
The class gets instantiated and the Encoding gets set. The CreateRows Sub procedure creates the rows of the ASCII Table. CreateTable adds the table headings and separators. ShowCharacter obtains the current character in the ASCII table and adds it with the help of the CreateRows procedure.
Create a new class and name it Characters. Add the following code into it.
C#
public class Characters { public string Character { get; set; } public string Decimal { get; set; } public string Hexadecimal { get; set; } public string Octal { get; set; } public string Binary { get; set; } public bool Visible { get; set; } = true; public int Code { get; set; } public string ControlSequence { get; set; } = ""; public Characters(int intCode, string strChar) { Code = intCode; Character = strChar.PadRight(5, ' ').Replace(((char)255) .ToString(), "*"); Decimal = Code.ToString().PadLeft(3, ' '); Hexadecimal = Convert.ToString(Code, 16).PadLeft(2, '0') .ToUpper(); Octal = Convert.ToString(Code, 8).PadLeft(3, '0'); Binary = Convert.ToString(Code, 2).PadLeft(8, '0'); if (strChar.StartsWith(((char)255).ToString())) Visible = false; if (Code < 32 && !Visible) ControlSequence = "CTRL " + (char)(Code + 64); } }
VB.NET
Public Class Characters Property Character As String Property [Decimal] As String Property Hexadecimal As String Property Octal As String Property Binary As String Property Visible As Boolean = True Property Code As Integer Property ControlSequence As String = "" Public Sub New(intCode As Integer, strChar As String) Code = intCode Character = strChar.PadRight(5, " "c).Replace(Chr(255), "*") [Decimal] = Code.ToString.PadLeft(3, " "c) Hexadecimal = Convert.ToString(Code, 16).PadLeft(2, "0"c) _ .ToUpper Octal = Convert.ToString(Code, 8).PadLeft(3, "0"c) Binary = Convert.ToString(Code, 2).PadLeft(8, "0"c) If strChar.StartsWith(Chr(255)) Then Visible = False End If If Code < 32 AndAlso Not Visible Then ControlSequence = "CTRL " & Chr(Code + 64) End If End Sub End Class
The Character class obtains the printable characters according to their encoding (Decimal, Hexadecimal, Octal, or Binary). Finally, add the code for the form.
C#
private void Form1_Load(object sender, EventArgs e) { clsASCII Table = new clsASCII(); RichTextBox1.Text = Table.CreateTable(true); }
VB.NET
Private Sub Form1_Load(sender As Object, e As EventArgs) _ Handles Me.Load Dim Table As New clsASCII RichTextBox1.Text = Table.CreateTable(True) End Sub
When run, your form will display as shown in Figures 1 and 2.
Figure 1: End Result, Part one
Figure 2: End Result, Part two
Conclusion
This was fun! I hope you have learned a great deal today. Until next time, cheers!