ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다. 이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다. ( 참고: ASCII - Wikipedia, the free encyclopedia )
다음은 7bit ASCII 코드표를 만들어 보여주는 C 언어 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수
convertAtoI()
convertItoA()
의 구현도 포함되어 있다.
- /*
- * Filename: makeAsciiTable.c
- * Make a table of ascii codes.
- *
- * Compile: cl makeAsciiTable.c
- * Execute: makeAsciiTable
- *
- * Date: 2008/03/27
- * Author: PH Kim [ pkim (AT) scripts.pe.kr ]
- */
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #define MAX_BUF 81
- enum { FALSE, TRUE };
- void println(char s[]) {
- printf("%s\n", s);
- }
- void print(char s[]) {
- printf("%s", s);
- }
- void printUsage() {
- println("Usage: makeAsciiTable");
- println("Make a table of ascii codes.");
- }
- char BASE36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- void convertItoA(char *pstr, long num, int radix) {
- char tmp[2];
- char ret[MAX_BUF];
- char arr[MAX_BUF];
- long q, r;
- int i, n;
- int isNegative = FALSE;
- if (num < 0L) {
- isNegative = TRUE;
- num = -num;
- }
- arr[0] = '\0';
- q = num;
- r = 0L;
- while (q >= (long) radix) {
- r = q % (long) radix;
- q = q / (long) radix;
- tmp[0] = BASE36[r];
- tmp[1] = '\0';
- strcat(arr, tmp);
- }
- tmp[0] = BASE36[q];
- tmp[1] = '\0';
- strcat(arr, tmp);
- if (isNegative) {
- strcat(arr, "-");
- }
- n = strlen(arr);
- for (i = 0; i < n; i++) {
- ret[i] = arr[n - i - 1];
- }
- ret[n] = '\0';
- strcpy(pstr, (char *) ret);
- }
- long convertAtoI(const char *pstr, int radix) {
- char tmp[2];
- long ret = 0L;
- char arr[MAX_BUF];
- long q, r;
- int isNegative = FALSE;
- int len = strlen(pstr);
- char c;
- int i;
- long val;
- c = pstr[0];
- if (c == '-') {
- isNegative = TRUE;
- }
- else if (c >= '0' && c <= '9') {
- ret = (long) (c - '0');
- }
- else if (c >= 'A' && c <= 'Z') {
- ret = (long) (c - 'A') + 10L;
- }
- else if (c >= 'a' && c <= 'z') {
- ret = (long) (c - 'a') + 10L;
- }
- if (ret >= (long) radix) {
- println(" Invalid character!");
- return ret;
- }
- for (i = 1; i < len; i++) {
- c = pstr[i];
- ret *= radix;
- if (c >= '0' && c <= '9') {
- val = (long) (c - '0');
- }
- else if (c >= 'A' && c <= 'Z') {
- val = (long) (c - 'A') + 10L;
- }
- else if (c >= 'a' && c <= 'z') {
- val = (long) (c - 'a') + 10L;
- }
- if (val >= (long) radix) {
- println(" Invalid character!");
- return ret;
- }
- ret += val;
- }
- return ret;
- }
- char asc[33][4] = {
- "NUL", "SOH", "STX", "ETX", "EOT",
- "ENQ", "ACK", "BEL", "BS", "HT",
- "LF", "VT", "FF", "CR", "SO",
- "SI", "DLE", "DC1", "DC2", "DC3",
- "DC4", "NAK", "SYN", "ETB", "CAN",
- "EM", "SUB", "ESC", "FS", "GS",
- "RS", "US", "Spc"
- };
- char control[33][36] = {
- "NUL (null)",
- "SOH (start of heading)",
- "STX (start of text)",
- "ETX (end of text)",
- "EOT (end of transmission)",
- "ENQ (enquiry)",
- "ACK (acknowledge)",
- "BEL (bell)",
- "BS (backspace)",
- "TAB (horizontal tab)",
- "LF (line feed, NL new line)",
- "VT (vertical tab)",
- "FF (form feed, NP new page)",
- "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 acknowledge)",
- "SYN (synchronous idle)",
- "ETB (end of trans. block)",
- "CAN (cancel)",
- "EM (end of medium)",
- "SUB (substitute, EOF end of file)",
- "ESC (escape)",
- "FS (file separator)",
- "GS (group separator)",
- "RS (record separator)",
- "US (unit separator)",
- };
- void makeTable() {
- char sbuf[MAX_BUF];
- char abuf[MAX_BUF/2];
- char tbuf[MAX_BUF/2];
- int i, j;
- unsigned char c;
- print(" ");
- for (i = 0; i < 8; i++) {
- print("+----");
- }
- print("+");
- println("");
- print(" ");
- print("| 0- ");
- print("| 1- ");
- print("| 2- ");
- print("| 3- ");
- print("| 4- ");
- print("| 5- ");
- print("| 6- ");
- print("| 7- ");
- print("|");
- println("");
- print("+---");
- for (i = 0; i < 8; i++) {
- print("+----");
- }
- print("+");
- println("");
- for (i = 0; i < 16; i++) {
- tbuf[0] = '\0';
- convertItoA(sbuf, (long) i, 16);
- strcat(tbuf, "| ");
- strcat(tbuf, sbuf);
- strcat(tbuf, " ");
- for (j = 0; j < 8; j++) {
- if (j*16 + i <= 32) {
- sprintf(abuf, "| %-3s", asc[j*16 + i]);
- }
- else if (j*16 + i == 127) {
- sprintf(abuf, "| %-3s", "DEL");
- }
- else {
- c = (char) (j*16 + i);
- sprintf(abuf, "| %2c ", c);
- }
- strcat(tbuf, abuf);
- }
- strcat(tbuf, "|");
- println(tbuf);
- }
- print("+---");
- for (i = 0; i < 8; i++) {
- print("+----");
- }
- print("+");
- println("");
- println("");
- for (i = 0; i < 16; i++) {
- sprintf(sbuf, "%-30s", control[i]);
- sprintf(tbuf, " %-34s", control[i+16]);
- print(sbuf);
- println(tbuf);
- }
- }
- void main(int argc, char *argv[]) {
- if (argc > 1 && strcmp("-h", argv[1]) == 0) {
- printUsage();
- exit(1);
- }
- makeTable();
- }
컴파일> cl makeAsciiTable.c
실행> makeAsciiTable
+----+----+----+----+----+----+----+----+ | 0- | 1- | 2- | 3- | 4- | 5- | 6- | 7- | +---+----+----+----+----+----+----+----+----+ | 0 | NUL| DLE| Spc| 0 | @ | P | ` | p | | 1 | SOH| DC1| ! | 1 | A | Q | a | q | | 2 | STX| DC2| " | 2 | B | R | b | r | | 3 | ETX| DC3| # | 3 | C | S | c | s | | 4 | EOT| DC4| $ | 4 | D | T | d | t | | 5 | ENQ| NAK| % | 5 | E | U | e | u | | 6 | ACK| SYN| & | 6 | F | V | f | v | | 7 | BEL| ETB| ' | 7 | G | W | g | w | | 8 | BS | CAN| ( | 8 | H | X | h | x | | 9 | HT | EM | ) | 9 | I | Y | i | y | | A | LF | SUB| * | : | J | Z | j | z | | B | VT | ESC| + | ; | K | [ | k | { | | C | FF | FS | , | < | L | \ | l | | | | D | CR | GS | - | = | M | ] | m | } | | E | SO | RS | . | > | N | ^ | n | ~ | | F | SI | US | / | ? | O | _ | o | DEL| +---+----+----+----+----+----+----+----+----+ NUL (null) DLE (data link escape) SOH (start of heading) DC1 (device control 1) STX (start of text) DC2 (device control 2) ETX (end of text) DC3 (device control 3) EOT (end of transmission) DC4 (device control 4) ENQ (enquiry) NAK (negative acknowledge) ACK (acknowledge) SYN (synchronous idle) BEL (bell) ETB (end of trans. block) BS (backspace) CAN (cancel) TAB (horizontal tab) EM (end of medium) LF (line feed, NL new line) SUB (substitute, EOF end of file) VT (vertical tab) ESC (escape) FF (form feed, NP new page) FS (file separator) CR (carriage return) GS (group separator) SO (shift out) RS (record separator) SI (shift in) US (unit separator)
'프로그래밍 > C' 카테고리의 다른 글
손으로 만드는 나눗셈 계산표 with C (0) | 2008.05.16 |
---|---|
삼각형 출력 예제를 통한 여러 가지 소스 비교 with C (0) | 2008.04.05 |
진법(radix) 표 만들기 예제 with C and Ch (0) | 2008.03.29 |
대화형 모드의 진법(radix) 변환 예제 with C and Ch (0) | 2008.03.28 |
황금비율(golden ratio) 구하기 with C or Ch (0) | 2008.03.24 |