Tag: coding

  • Chastelib Readme and Manifesto

    Chastelib is a library I have been developing since mid 2025, though some of the functions have existed in some form for 20 years and have been hacked together as I needed them for projects. Over the past 6 months, I have refined them and have extensively documented the source code, and have even begun writing a manual on how to use them. This project will take years, as I have fun improving things and explaining why my own methods of outputting numbers now surpass the capabilities of the C and C++ standard libraries when it comes to printing integers in other bases.

    To my knowledge, nobody other than me uses these functions, but they are extremely easy to use by including header files or just copy pasting the functions you like into your own C and C++ projects.

    Core Function List

    • intstr: Convert an integer to astring in bases 2 to 36
    • strint: Convert a string in bases 2 to 36 to an integer
    • putstring: Print a zero-terminated string to standard output
    • putint: Print an integer using intstr and then putstr

    To understand the context of this library and how it came about, you have to know that I have been a C programmer for 25 years. Most of my projects are just toy programs for printing sequences of integers. Even more strange is that I enjoy bases other than ten, referred to as decimal by humans.

    Math is a game to me, and I do computer programming for fun. I also think that the C programming language is the best programming language to ever exist. However, there are some limitations that come with it.

    The printf family of functions can output formatted text containing arbitrary strings of text with format specifiers and arguments to print integers and floating point numbers.

    For integers, there is the %d for decimal, %u for unsigned decimal, %X for hexadecimal, and %o for octal. Although these are the most common number bases used, I prefer the option to print binary. The %b format specifier does exist as a GNU extension, but because I like my code to conform to the 1989 standard, I decided I should write my own set to manage the conversion of integers to and from strings that I can always rely on.

    Of the core functions, only putstring uses a C standard library function. It uses the low-level fwrite function to write a string after finding its length by searching for the terminating zero.

    Although simple, the putstring allows me flexibility when I am translating chastelib to use a new C library, or when I want to translate all the functions to another programming language.

    For example, when using other languages, I can’t rely on printf being available. Moreover, printf is a complicated function to write, and I have no idea how it actually works. When I tried translating my functions to Rust, having putstring as my trusted output function helped a lot. That being said, Rust is a painful language, and I stopped because it hurt my head too much, which is saying something, given how good I am at Assembly language on Intel platforms.

    The putstring function also helped when I was using ncurses because I could just change putstring to call addstr, which does the same thing in the context of terminal programs written with ncurses.

    The other functions don’t read or write to any devices and rely on putstring to show results. However, this means they execute very fast. Not only is C fast because it is a compiled language, but I have incrementally improved my algorithm over months to do the work quickly, and also made the code look good at the same time.

    Of all the functions used, strint is used the least because most of the time I am the only one providing input to my programs. If other people were using my programs, they would of course provide strings from the keyboard that would be parsed as integers. I have tested the function to ensure that it works correctly. In fact, my program chastehex was why the function was originally written. I could have had a generic hexadecimal converting function, but I made one that was flexible and supported any base from 2 to 36.

    Technical note: Base 36 is the highest base because digits 0 to 9 are used for digits less than ten. Letters A through Z are used as 10 to 35, whether they are uppercase or lowercase. The ten digits plus 26 letters of the English Alphabet provide a standard that programmers have used before I was even born. It is a good standard, and so I stuck with it.

    Future Extensions

    • floating point conversions
    • ncurses utilities

    The Github repository with the latest source is here:

    https://github.com/chastitywhiterose/chastelib

  • C chastelib core 2-25-2026

    There comes a time every so often when I find a typo in my source code. I recently found one in the C version of chastelib. I used the opportunity to expand on my existing comments to better explain the purpose of these functions which are used in my chastehex and chastecmp programs.

    I am also working on extension libraries to add to chastelib to support future command line utilities I might write, even if I don’t know what tools I will write. I have dreams of making my own small programming language but what I imagine is more complex that I am prepared for at my skill level and lack of free time.

    I just finished my Programming 2 class about C++ and I have to say that I still prefer C, even though there are some features of C++ such as function overloading that I find extremely cool.

    Anyway, read below this years edition of the 4 functions that make up the core of chastelib, my own standard library I am building.

    /*
     This file is a library of functions written by Chastity White Rose. The functions are for converting strings into integers and integers into strings.
     I did it partly for future programming plans and also because it helped me learn a lot in the process about how pointers work
     as well as which features the standard library provides, and which things I need to write my own functions for.
    
     As it turns out, the integer output routines for C are too limited for my tastes. This library corrects this problem.
     Using the global variables and functions in this file, integers can be output in bases/radixes 2 to 36
    */
    
    /*
     These two lines define a static array with a size big enough to store the digits of an integer, including padding it with extra zeroes.
     The integer conversion function always references a pointer to this global string, and this allows other standard library functions
     such as printf to display the integers to standard output or even possibly to files.
    */
    
    #define usl 32 /*usl stands for Unsigned String Length*/
    char int_string[usl+1]; /*global string which will be used to store string of integers. Size is usl+1 for terminating zero*/
    
     /*radix or base for integer output. 2=binary, 8=octal, 10=decimal, 16=hexadecimal*/
    int radix=2;
    /*default minimum digits for printing integers*/
    int int_width=1;
    
    /*
    This function is one that I wrote because the standard library can display integers as decimal, octal, or hexadecimal, but not any other bases(including binary, which is my favorite).
    My function corrects this, and in my opinion, such a function should have been part of the standard library, but I'm not complaining because now I have my own, which I can use forever!
    More importantly, it can be adapted for any programming language in the world if I learn the basics of that language.
    */
    
    char *intstr(unsigned int i)
    {
     int width=0;
     char *s=int_string+usl;
     *s=0;
     while(i!=0 || width<int_width)
     {
      s--;
      *s=i%radix;
      i/=radix;
      if(*s<10){*s+='0';}
      else{*s=*s+'A'-10;}
      width++;
     }
     return s;
    }
    
    /*
     This function prints a string using fwrite.
     This algorithm is the best C representation of how my Assembly programs also work.
     Its true purpose is to be used in the putint function for conveniently printing integers, 
     but it can print any valid string.
    */
    
    void putstring(const char *s)
    {
     int c=0;
     const char *p=s;
     while(*p++){c++;} 
     fwrite(s,1,c,stdout);
    }
    
    /*
     This function uses both intstr and putstring to print an integer in the currently selected radix and width.
    */
    
    void putint(unsigned int i)
    {
     putstring(intstr(i));
    }
    
    /*
     This function is my own replacement for the strtol function from the C standard library.
     I didn't technically need to make this function because the functions from stdlib.h can already convert strings from bases 2 to 36 into integers.
     However, my function is simpler because it only requires 2 arguments instead of three, and it also does not handle negative numbers.
    I have never needed negative integers, but if I ever do, I can use the standard functions or write my own in the future.
    */
    
    int strint(const char *s)
    {
     int i=0;
     char c;
     if( radix<2 || radix>36 ){printf("Error: radix %i is out of range!\n",radix);}
     while( *s == ' ' || *s == '\n' || *s == '\t' ){s++;} /*skip whitespace at beginning*/
     while(*s!=0)
     {
      c=*s;
      if( c >= '0' && c <= '9' ){c-='0';}
      else if( c >= 'A' && c <= 'Z' ){c-='A';c+=10;}
      else if( c >= 'a' && c <= 'z' ){c-='a';c+=10;}
      else if( c == ' ' || c == '\n' || c == '\t' ){break;}
      else{printf("Error: %c is not an alphanumeric character!\n",c);break;}
      if(c>=radix){printf("Error: %c is not a valid character for radix %i\n",*s,radix);break;}
      i*=radix;
      i+=c;
      s++;
     }
     return i;
    }
    
    /*
     Those four functions above are the core of chastelib.
     While there may be extensions written for specific programs, these functions are essential for absolutely every program I write.
     
     The only reason you would not need them is if you only output numbers in decimal or hexadecimal, because printf in C can do all that just fine.
     However, the reason my core functions are superior to printf is that printf and its family of functions require the user to memorize all the arcane symbols for format specifiers.
     
     The core functions are primarily concerned with standard output and the conversion of strings and integers. They do not deal with input from the keyboard or files. A separate extension will be written for my programs that need these features.
    */
    
  • Advice to a new Programmer

    This month I started a Programming 1 class as part of Full Sail University’s ACE program. One of the other students asked me some questions and I ended up writing a larger response than I planned. I think my information will be helpful for other people who are new to programming.

    Hello chastity, I’m Ty. I appreciate you teaching others what you know. I do not know anything about programming, but I’m hoping I learn a lot from this college course and make friends like you. I would love any tips you have for me, as a programmer newbie. What language to start with? Fundamental apps, tools, services, etc.. anything I should to start. Thank you chastity.

    There are many tools I can recommend. Mostly, I stick with Free and Open Source software. I write most of my code in the C Programming Language, which came before C++. I use the GCC compiler, and I even use GNU Make to automate compiling and running my programs.

    I am looking forward to learning about how C++ is different than C. I always found C to be an easy language because it is smaller than C++, and I have most of the functions memorized.

    Also, you may find this helpful.

    https://chastitywhiterose.github.io/Chastity-Code-Cookbook/

    It is a book/website I have been writing to help teach programming, but also to share some of my impressive code examples and philosophy of why I promote Free Software.

    Everything on there is entirely free and released under the GPL3 license. I consider it my act of community service to give back to the open source community because it has benefitted me all my life. I have a blast compiling my C programs on Debian Linux with GCC on computers too old to run modern versions of Windows. I don’t even use an IDE. I only use a console and a text editor as if I were living in the 1980s. But at least this Programming 1 course teaches things as most humans would find convenient.

    I can also probably help you with specific programming questions. What operating system do you use, and how is your general math knowledge? I think you will find that no matter what programming language becomes your favorite, every data type really is numbers, even such things as colors or coordinates for shapes in video games.

    Most of the magic in the video game, Chaste Tris, that I published comes from my knowledge of numbers rather than it does being a good programmer. I consider myself more of a gamer and mathematician than I am a skilled programmer.

    https://store.steampowered.com/app/1986120/Chaste_Tris/

    I also wanted to mention some cool text editors that you might like. On Windows, Notepad++ is the most convenient text editor because it has syntax highlighting, but it loads up faster than Visual Studio if you are doing your own programming for fun, which isn’t required for the class.

    https://notepad-plus-plus.org/

    But I also recommend Geany because it runs on Windows, Mac, or Linux. I use it quite a bit when I need my code to be more readable for larger projects.

    https://www.geany.org/

    I think the most important feature of a text editor and/or IDE for a programmer is the ability to see the line numbers because when a compiler tells me an error I have on a specific line, being able to see which line that number is on helps out a lot. The second most important feature is to choose a highlighting syntax that is easy on your eyes. Each person is different, and their eyes perceive colors differently. A lot of these editors will let you choose a scheme that works for you, or even create your own. For example, you might like numbers to be in blue text and functions to be green. Or maybe you like a black background with bright colors like magenta or yellow for the text. I like my code to look beautiful as well as to compile and run successfully.

  • New C test program for chastelib

    In my last post, I showed the test program for the Rust version of chastelib. I decided it would make sense to design a similar test program that uses the original C version of the library that I used when converting to Rust. Personally I like this version better. Global variables makes the code cleaner in my opinion because otherwise how would I choose which order the arguments to the functions would go in? This way, the radix and width of the integer string are set by global data before calling the putint function.

    Also notice that the b variable is set to an integer by a string using strint. This is only to demonstrate proper use of the function. Normally it would not be used unless getting string input from a user by command line argument such as was done in chastehex.

    In any case, this library controls all the integer and string conversion so that I can use it in larger projects. Because it is in ANSI C, it is portable to any machine that exists in modern times.

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include "chastelib.h"
    
    int main(int argc, char *argv[])
    {
     int a=0,b;
    
     radix=16;
     int_width=1;
    
     putstring("This is the official test program for the C version of chastelib.\n");
     b=strint("100");
    
     putstring("Hello World!\n");
     
     while(a<b)
     {
      radix=2;
      int_width=8;
      putint(a);
      putstring(" ");
      radix=16;
      int_width=2;
      putint(a);
      putstring(" ");
      radix=10;
      int_width=3;
      putint(a);
    
      if(a>=0x20 && a<=0x7E)
      {
       putstring(" ");
       putchar(a);
      }
    
      putstring("\n");
      a+=1;
     }
      
     return 0;
    }
    

    Below is the command to compile and run it and the output.

    gcc -Wall -ansi -pedantic main.c -o main && ./main
    This is the official test program for the C version of chastelib.
    Hello World!
    00000000 00 000
    00000001 01 001
    00000010 02 002
    00000011 03 003
    00000100 04 004
    00000101 05 005
    00000110 06 006
    00000111 07 007
    00001000 08 008
    00001001 09 009
    00001010 0A 010
    00001011 0B 011
    00001100 0C 012
    00001101 0D 013
    00001110 0E 014
    00001111 0F 015
    00010000 10 016
    00010001 11 017
    00010010 12 018
    00010011 13 019
    00010100 14 020
    00010101 15 021
    00010110 16 022
    00010111 17 023
    00011000 18 024
    00011001 19 025
    00011010 1A 026
    00011011 1B 027
    00011100 1C 028
    00011101 1D 029
    00011110 1E 030
    00011111 1F 031
    00100000 20 032  
    00100001 21 033 !
    00100010 22 034 "
    00100011 23 035 #
    00100100 24 036 $
    00100101 25 037 %
    00100110 26 038 &
    00100111 27 039 '
    00101000 28 040 (
    00101001 29 041 )
    00101010 2A 042 *
    00101011 2B 043 +
    00101100 2C 044 ,
    00101101 2D 045 -
    00101110 2E 046 .
    00101111 2F 047 /
    00110000 30 048 0
    00110001 31 049 1
    00110010 32 050 2
    00110011 33 051 3
    00110100 34 052 4
    00110101 35 053 5
    00110110 36 054 6
    00110111 37 055 7
    00111000 38 056 8
    00111001 39 057 9
    00111010 3A 058 :
    00111011 3B 059 ;
    00111100 3C 060 <
    00111101 3D 061 =
    00111110 3E 062 >
    00111111 3F 063 ?
    01000000 40 064 @
    01000001 41 065 A
    01000010 42 066 B
    01000011 43 067 C
    01000100 44 068 D
    01000101 45 069 E
    01000110 46 070 F
    01000111 47 071 G
    01001000 48 072 H
    01001001 49 073 I
    01001010 4A 074 J
    01001011 4B 075 K
    01001100 4C 076 L
    01001101 4D 077 M
    01001110 4E 078 N
    01001111 4F 079 O
    01010000 50 080 P
    01010001 51 081 Q
    01010010 52 082 R
    01010011 53 083 S
    01010100 54 084 T
    01010101 55 085 U
    01010110 56 086 V
    01010111 57 087 W
    01011000 58 088 X
    01011001 59 089 Y
    01011010 5A 090 Z
    01011011 5B 091 [
    01011100 5C 092 \
    01011101 5D 093 ]
    01011110 5E 094 ^
    01011111 5F 095 _
    01100000 60 096 `
    01100001 61 097 a
    01100010 62 098 b
    01100011 63 099 c
    01100100 64 100 d
    01100101 65 101 e
    01100110 66 102 f
    01100111 67 103 g
    01101000 68 104 h
    01101001 69 105 i
    01101010 6A 106 j
    01101011 6B 107 k
    01101100 6C 108 l
    01101101 6D 109 m
    01101110 6E 110 n
    01101111 6F 111 o
    01110000 70 112 p
    01110001 71 113 q
    01110010 72 114 r
    01110011 73 115 s
    01110100 74 116 t
    01110101 75 117 u
    01110110 76 118 v
    01110111 77 119 w
    01111000 78 120 x
    01111001 79 121 y
    01111010 7A 122 z
    01111011 7B 123 {
    01111100 7C 124 |
    01111101 7D 125 }
    01111110 7E 126 ~
    01111111 7F 127
    10000000 80 128
    10000001 81 129
    10000010 82 130
    10000011 83 131
    10000100 84 132
    10000101 85 133
    10000110 86 134
    10000111 87 135
    10001000 88 136
    10001001 89 137
    10001010 8A 138
    10001011 8B 139
    10001100 8C 140
    10001101 8D 141
    10001110 8E 142
    10001111 8F 143
    10010000 90 144
    10010001 91 145
    10010010 92 146
    10010011 93 147
    10010100 94 148
    10010101 95 149
    10010110 96 150
    10010111 97 151
    10011000 98 152
    10011001 99 153
    10011010 9A 154
    10011011 9B 155
    10011100 9C 156
    10011101 9D 157
    10011110 9E 158
    10011111 9F 159
    10100000 A0 160
    10100001 A1 161
    10100010 A2 162
    10100011 A3 163
    10100100 A4 164
    10100101 A5 165
    10100110 A6 166
    10100111 A7 167
    10101000 A8 168
    10101001 A9 169
    10101010 AA 170
    10101011 AB 171
    10101100 AC 172
    10101101 AD 173
    10101110 AE 174
    10101111 AF 175
    10110000 B0 176
    10110001 B1 177
    10110010 B2 178
    10110011 B3 179
    10110100 B4 180
    10110101 B5 181
    10110110 B6 182
    10110111 B7 183
    10111000 B8 184
    10111001 B9 185
    10111010 BA 186
    10111011 BB 187
    10111100 BC 188
    10111101 BD 189
    10111110 BE 190
    10111111 BF 191
    11000000 C0 192
    11000001 C1 193
    11000010 C2 194
    11000011 C3 195
    11000100 C4 196
    11000101 C5 197
    11000110 C6 198
    11000111 C7 199
    11001000 C8 200
    11001001 C9 201
    11001010 CA 202
    11001011 CB 203
    11001100 CC 204
    11001101 CD 205
    11001110 CE 206
    11001111 CF 207
    11010000 D0 208
    11010001 D1 209
    11010010 D2 210
    11010011 D3 211
    11010100 D4 212
    11010101 D5 213
    11010110 D6 214
    11010111 D7 215
    11011000 D8 216
    11011001 D9 217
    11011010 DA 218
    11011011 DB 219
    11011100 DC 220
    11011101 DD 221
    11011110 DE 222
    11011111 DF 223
    11100000 E0 224
    11100001 E1 225
    11100010 E2 226
    11100011 E3 227
    11100100 E4 228
    11100101 E5 229
    11100110 E6 230
    11100111 E7 231
    11101000 E8 232
    11101001 E9 233
    11101010 EA 234
    11101011 EB 235
    11101100 EC 236
    11101101 ED 237
    11101110 EE 238
    11101111 EF 239
    11110000 F0 240
    11110001 F1 241
    11110010 F2 242
    11110011 F3 243
    11110100 F4 244
    11110101 F5 245
    11110110 F6 246
    11110111 F7 247
    11111000 F8 248
    11111001 F9 249
    11111010 FA 250
    11111011 FB 251
    11111100 FC 252
    11111101 FD 253
    11111110 FE 254
    11111111 FF 255
    
    

    Finally, here is the source to the library itself which was included by main.c at the top of the post.

    chastelib.h

    /*
    This file is a library of functions written by Chastity White Rose. The functions are for converting strings into integers and integers into strings. I did it partly for future programming plans and also because it helped me learn a lot in the process about how pointers work as well as which features the standard library provides and which things I need to write my own functions for.
    */
    
    /* These two lines define a static array with a size big enough to store the digits of an integer including padding it with extra zeroes. The function which follows always returns a pointer to this global string and this allows other standard library functions such as printf to display the integers to standard output or even possibly to files.*/
    
    #define usl 32
    char int_string[usl+1]; /*global string which will be used to store string of integers*/
    
     /*radix or base for integer output. 2=binary, 8=octal, 10=decimal, 16=hexadecimal*/
    int radix=2;
    /*default minimum digits for printing integers*/
    int int_width=1;
    
    /*
    This function is one that I wrote because the standard library can display integers as decimai, octai, or hexadecimal but not any other bases(including binary which is my favorite). My function corrects this and in my opinion such a function should have been part of the standard library but I'm not complaining because now I have my own which I can use forever!
    */
    
    char* intstr(unsigned int i)
    {
     int width=0;
     char *s=int_string+usl;
     *s=0;
     while(i!=0 || width<int_width)
     {
      s--;
      *s=i%radix;
      i/=radix;
      if(*s<10){*s+='0';}else{*s=*s+'A'-10;}
      width++;
     }
    
     return s;
    }
    
    /*
    This function is my own replacement for the strtol function from the C standard library. I didn't technically need to make this function because the functions from stdlib.h can already convert strings from bases 2 to 36 into integers. However my function is simpler because it only requires 2 arguments instead of three and it also does not handle negative numbers. Never have I needed negative integers but if I ever do I can use the standard functions or write my own in the future.
    */
    
    int strint(char *s)
    {
     int i=0;
     char c;
     if( radix<2 || radix>36 ){printf("Error: radix %i is out of range!\n",radix);return i;}
     while( *s == ' ' || *s == '\n' || *s == '\t' ){s++;} /*skip whitespace at beginning*/
     while(*s!=0)
     {
      c=*s;
      if( c >= '0' && c <= '9' ){c-='0';}
      else if( c >= 'A' && c <= 'Z' ){c-='A';c+=10;}
      else if( c >= 'a' && c <= 'z' ){c-='a';c+=10;}
      else if( c == ' ' || c == '\n' || c == '\t' ){return i;}
      else{printf("Error: %c is not an alphanumeric character!\n",c);return i;}
      if(c>=radix){printf("Error: %c is not a valid character for radix %i\n",*s,radix);return i;}
      i*=radix;
      i+=c;
      s++;
     }
     return i;
    }
    
    /*
    this function prints a string using fwrite
    This is the best C representation of how my Assembly programs also work/
    */
    
    void putstring(char *s)
    {
     int c=0;
     char *p=s;
     while(*p++){c++;} 
     fwrite(s,1,c,stdout);
    }
    
    void putint(unsigned int i)
    {
     putstring(intstr(i));
    }
    
    
  • Rust Programming Language: putint function

    I started learning the Rust programming language and so far I find it more difficult than assembly. However, I finally got a working prototype of my putint function that I have written using both C and Assembly before.

    fn main()
    {
     println!("This is a test of the putint function I wrote for the Rust programming language.");
     let mut i:i32=0;
     while i<256
     {
      putint(i,2,8);
      print!(" ");
      putint(i,16,2);
      print!(" ");
      putint(i,10,3);
      println!();
      i+=1;
     }
    }
    
    /*
     This is the putint function for printing an integer in any base from 2 to 36.
     It is the same function I wrote in C and Assembly but with some key differences for Rust.
    
     Rust doesn't allow global variables in "safe" mode. Therefore, the radix and the int_width must be passed to the function each time.
     I find this inefficient because usually I am just choosing one radix for the duration of the entire program.
     The width also typically stays the same unless I am doing something fancy, such as I did in chastehex.
    
     The first loop stores the correct ASCII numbers as unsigned bytes in an array by repeatedly dividing by the radix and converting the remainder of division into u8 (unsigned 8 bit integer) after adding the correct numbers based on the ASCII table.
    
     The second loop converts these ASCII numbers into the Rust (char) type and prints them in the reverse order of how they were stored.
    
     Most of the code in this function was required only because Rust imposes limitations on what I can do because strings are not simply mutable arrays of bytes like they are in C or Assembly. Additionally the char type is not the same as the char type in C. In C, chars are the same as 1 byte but in Rust they are actually unicode characters that are 4 bytes each.
    
    There is probably a better way to write this function in Rust but this is the first that has worked for me. The code is nearly twice the size of the C version of this function, but it will allow me to print my integers in any radix I want as I continue to learn the Rust programming language and see if it is worth the trouble of learning.
    
    */
    
    fn putint(mut i:i32,radix:i32,int_width:usize)
    {
     let mut a: [u8;32]=[0;32]; //create array of max size needed for 32 bit integer
     let mut width=0; //keeps track of current width of integer (how many digits in the chosen radix)
     let mut r:i32; //used to store the remainder of division
    
     while i!=0 || width<int_width
     {
      r=i%radix;
      i/=radix;
      if r<10 { r+=0x30 }
      else {r+=0x37}
      a[width]=r as u8;
      width+=1;
     }
    
     while width>0
     {
      width-=1;
      print!("{}", a[width] as char );
     }
    }
    

    The output of this program is the following. As you can see, it allows me to customize the radix/base and the width so that everything is lined up neatly in the autistic way I require.

    This is a test of the putint function I wrote for the Rust programming language.
    00000000 00 000
    00000001 01 001
    00000010 02 002
    00000011 03 003
    00000100 04 004
    00000101 05 005
    00000110 06 006
    00000111 07 007
    00001000 08 008
    00001001 09 009
    00001010 0A 010
    00001011 0B 011
    00001100 0C 012
    00001101 0D 013
    00001110 0E 014
    00001111 0F 015
    00010000 10 016
    00010001 11 017
    00010010 12 018
    00010011 13 019
    00010100 14 020
    00010101 15 021
    00010110 16 022
    00010111 17 023
    00011000 18 024
    00011001 19 025
    00011010 1A 026
    00011011 1B 027
    00011100 1C 028
    00011101 1D 029
    00011110 1E 030
    00011111 1F 031
    00100000 20 032
    00100001 21 033
    00100010 22 034
    00100011 23 035
    00100100 24 036
    00100101 25 037
    00100110 26 038
    00100111 27 039
    00101000 28 040
    00101001 29 041
    00101010 2A 042
    00101011 2B 043
    00101100 2C 044
    00101101 2D 045
    00101110 2E 046
    00101111 2F 047
    00110000 30 048
    00110001 31 049
    00110010 32 050
    00110011 33 051
    00110100 34 052
    00110101 35 053
    00110110 36 054
    00110111 37 055
    00111000 38 056
    00111001 39 057
    00111010 3A 058
    00111011 3B 059
    00111100 3C 060
    00111101 3D 061
    00111110 3E 062
    00111111 3F 063
    01000000 40 064
    01000001 41 065
    01000010 42 066
    01000011 43 067
    01000100 44 068
    01000101 45 069
    01000110 46 070
    01000111 47 071
    01001000 48 072
    01001001 49 073
    01001010 4A 074
    01001011 4B 075
    01001100 4C 076
    01001101 4D 077
    01001110 4E 078
    01001111 4F 079
    01010000 50 080
    01010001 51 081
    01010010 52 082
    01010011 53 083
    01010100 54 084
    01010101 55 085
    01010110 56 086
    01010111 57 087
    01011000 58 088
    01011001 59 089
    01011010 5A 090
    01011011 5B 091
    01011100 5C 092
    01011101 5D 093
    01011110 5E 094
    01011111 5F 095
    01100000 60 096
    01100001 61 097
    01100010 62 098
    01100011 63 099
    01100100 64 100
    01100101 65 101
    01100110 66 102
    01100111 67 103
    01101000 68 104
    01101001 69 105
    01101010 6A 106
    01101011 6B 107
    01101100 6C 108
    01101101 6D 109
    01101110 6E 110
    01101111 6F 111
    01110000 70 112
    01110001 71 113
    01110010 72 114
    01110011 73 115
    01110100 74 116
    01110101 75 117
    01110110 76 118
    01110111 77 119
    01111000 78 120
    01111001 79 121
    01111010 7A 122
    01111011 7B 123
    01111100 7C 124
    01111101 7D 125
    01111110 7E 126
    01111111 7F 127
    10000000 80 128
    10000001 81 129
    10000010 82 130
    10000011 83 131
    10000100 84 132
    10000101 85 133
    10000110 86 134
    10000111 87 135
    10001000 88 136
    10001001 89 137
    10001010 8A 138
    10001011 8B 139
    10001100 8C 140
    10001101 8D 141
    10001110 8E 142
    10001111 8F 143
    10010000 90 144
    10010001 91 145
    10010010 92 146
    10010011 93 147
    10010100 94 148
    10010101 95 149
    10010110 96 150
    10010111 97 151
    10011000 98 152
    10011001 99 153
    10011010 9A 154
    10011011 9B 155
    10011100 9C 156
    10011101 9D 157
    10011110 9E 158
    10011111 9F 159
    10100000 A0 160
    10100001 A1 161
    10100010 A2 162
    10100011 A3 163
    10100100 A4 164
    10100101 A5 165
    10100110 A6 166
    10100111 A7 167
    10101000 A8 168
    10101001 A9 169
    10101010 AA 170
    10101011 AB 171
    10101100 AC 172
    10101101 AD 173
    10101110 AE 174
    10101111 AF 175
    10110000 B0 176
    10110001 B1 177
    10110010 B2 178
    10110011 B3 179
    10110100 B4 180
    10110101 B5 181
    10110110 B6 182
    10110111 B7 183
    10111000 B8 184
    10111001 B9 185
    10111010 BA 186
    10111011 BB 187
    10111100 BC 188
    10111101 BD 189
    10111110 BE 190
    10111111 BF 191
    11000000 C0 192
    11000001 C1 193
    11000010 C2 194
    11000011 C3 195
    11000100 C4 196
    11000101 C5 197
    11000110 C6 198
    11000111 C7 199
    11001000 C8 200
    11001001 C9 201
    11001010 CA 202
    11001011 CB 203
    11001100 CC 204
    11001101 CD 205
    11001110 CE 206
    11001111 CF 207
    11010000 D0 208
    11010001 D1 209
    11010010 D2 210
    11010011 D3 211
    11010100 D4 212
    11010101 D5 213
    11010110 D6 214
    11010111 D7 215
    11011000 D8 216
    11011001 D9 217
    11011010 DA 218
    11011011 DB 219
    11011100 DC 220
    11011101 DD 221
    11011110 DE 222
    11011111 DF 223
    11100000 E0 224
    11100001 E1 225
    11100010 E2 226
    11100011 E3 227
    11100100 E4 228
    11100101 E5 229
    11100110 E6 230
    11100111 E7 231
    11101000 E8 232
    11101001 E9 233
    11101010 EA 234
    11101011 EB 235
    11101100 EC 236
    11101101 ED 237
    11101110 EE 238
    11101111 EF 239
    11110000 F0 240
    11110001 F1 241
    11110010 F2 242
    11110011 F3 243
    11110100 F4 244
    11110101 F5 245
    11110110 F6 246
    11110111 F7 247
    11111000 F8 248
    11111001 F9 249
    11111010 FA 250
    11111011 FB 251
    11111100 FC 252
    11111101 FD 253
    11111110 FE 254
    11111111 FF 255