ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다.  이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다.  ( 참고:  ASCII - Wikipedia, the free encyclopedia )

다음은  7bit ASCII 코드표를 만들어 보여주는 Go 언어 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수

        convertAtoI()
        convertItoA()

의 구현도 포함되어 있다.



  1. /*
  2.  *  Filename: makeAsciiTable.go
  3.  *            Make a table of ascii codes.
  4.  *
  5.  *  Execute: go run makeAsciiTable.go
  6.  *
  7.  *  or
  8.  *
  9.  *  Compile: go build makeAsciiTable.go
  10.  *  Execute: ./makeAsciiTable
  11.  *
  12.  *      Date:  2012/06/25
  13.  *    Author:  PH Kim   [ pkim (AT) scripts.pe.kr ]
  14.  */
  15. package main
  16. import (
  17.     "fmt"
  18.     "os"
  19. )   
  20. func println(s string) {
  21.     fmt.Printf("%s\n", s)
  22. }
  23. func print(s string) {
  24.     fmt.Printf("%s", s)
  25. }
  26. func printUsage() {
  27.     println("Usage: makeAsciiTable")
  28.     println("Make a table of ascii codes.")
  29. }
  30. func convertItoA(num int64, radix int) (ret string) {
  31.     var BASE36 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  32.     var tmp string
  33.     var arr string
  34.     var q, r int64
  35.     var i, n int
  36.     var isNegative bool = false
  37.     if num < 0 {
  38.         isNegative = true
  39.         num = -num
  40.     }
  41.     arr = ""
  42.     q = num
  43.     r = 0
  44.     for q >= int64(radix) {
  45.         r = q % int64(radix)
  46.         q = q / int64(radix)
  47.         tmp = BASE36[r:r+1]
  48.         arr += tmp
  49.     }
  50.     tmp = BASE36[q:q+1]
  51.     arr += tmp
  52.     if isNegative {
  53.         arr += "-"
  54.     }
  55.     n = len(arr)
  56.     for i = 0; i < n; i++ {
  57.         ret += arr[n - i - 1:n-i]
  58.     }
  59.     return ret
  60. }
  61. func convertAtoI(str string, radix int) (ret int64) {
  62.     var isNegative bool = false
  63.     var len int = len(str)
  64.     var c byte
  65.     var i int
  66.     var val int64
  67.     c = str[0]
  68.     if c == '-' { 
  69.         isNegative = true
  70.     } else if c >= '0' && c <= '9' {
  71.         ret = int64(c) - int64('0');
  72.     } else if c >= 'A' && c <= 'Z' {
  73.         ret = int64(c - 'A') + 10
  74.     } else if c >= 'a' && c <= 'z' {
  75.         ret = int64(c - 'a') + 10;
  76.     }
  77.     if ret >= int64(radix) {
  78.         println("        Invalid character!")
  79.         return ret
  80.     }
  81.     for i = 1; i < len; i++ {
  82.         c = str[i]
  83.         ret *= int64(radix)
  84.         if c >= '0' && c <= '9' {
  85.             val = int64(c - '0')
  86.         } else if c >= 'A' && c <= 'Z' {
  87.             val = int64(c - 'A') + 10
  88.         } else if c >= 'a' && c <= 'z' {
  89.             val = int64(c - 'a') + 10
  90.         }
  91.         if val >= int64(radix) {
  92.             println("        Invalid character!")
  93.             return ret
  94.         }
  95.         ret += val
  96.     }
  97.     if isNegative {
  98.         ret = -ret
  99.     }
  100.     return ret
  101. }
  102. func makeTable() {
  103.      var asc = [...] string {
  104.      "NUL", "SOH", "STX", "ETX", "EOT",
  105.      "ENQ", "ACK", "BEL", "BS", "HT",
  106.      "LF", "VT", "FF", "CR", "SO",
  107.      "SI", "DLE", "DC1", "DC2", "DC3",
  108.      "DC4", "NAK", "SYN", "ETB", "CAN",
  109.      "EM", "SUB", "ESC", "FS", "GS",
  110.      "RS", "US", "Spc"  }
  111.     var control = [...]string{
  112.         "NUL (null)",
  113.         "SOH (start of heading)",
  114.         "STX (start of text)",
  115.         "ETX (end of text)",
  116.         "EOT (end of transmission)",
  117.         "ENQ (enquiry)",
  118.         "ACK (acknowledge)",
  119.         "BEL (bell)",
  120.         "BS  (backspace)",
  121.         "TAB (horizontal tab)",
  122.         "LF  (line feed, NL new line)",
  123.         "VT  (vertical tab)",
  124.         "FF  (form feed, NP new page)",
  125.         "CR  (carriage return)",
  126.         "SO  (shift out)",
  127.         "SI  (shift in)",
  128.         "DLE (data link escape)",
  129.         "DC1 (device control 1)",
  130.         "DC2 (device control 2)",
  131.         "DC3 (device control 3)",
  132.         "DC4 (device control 4)",
  133.         "NAK (negative acknowledge)",
  134.         "SYN (synchronous idle)",
  135.         "ETB (end of trans. block)",
  136.         "CAN (cancel)",
  137.         "EM  (end of medium)",
  138.         "SUB (substitute, EOF end of file)",
  139.         "ESC (escape)",
  140.         "FS  (file separator)",
  141.         "GS  (group separator)",
  142.         "RS  (record separator)",
  143.         "US  (unit separator)"   }
  144.     var sbuf, abuf, tbuf string
  145.     var i, j int
  146.     var c byte
  147.     print("    ");
  148.     for i = 0; i < 8; i++ {
  149.         print("+----")
  150.     }
  151.     print("+")
  152.     println("")
  153.     print("    ")
  154.     print("| 0- ");
  155.     print("| 1- ");
  156.     print("| 2- ");
  157.     print("| 3- ");
  158.     print("| 4- ");
  159.     print("| 5- ");
  160.     print("| 6- ");
  161.     print("| 7- ");
  162.     print("|")
  163.     println("")
  164.     print("+---")
  165.     for i = 0; i < 8; i++ {
  166.         print("+----")
  167.     }
  168.     print("+")
  169.     println("")
  170.     for i = 0; i < 16; i++ {
  171.         tbuf = ""
  172.         sbuf = convertItoA(int64(i), 16)
  173.         tbuf += "| "
  174.         tbuf += sbuf
  175.         tbuf += " "
  176.         for j = 0; j < 8; j++ {
  177.             if j*16 + i <= 32 {
  178.                 abuf = fmt.Sprintf("| %-3s", asc[j*16 + i])
  179.             } else if (j*16 + i == 127) {
  180.                 abuf = fmt.Sprintf("| %-3s", "DEL")
  181.             } else {
  182.                 c = byte(j*16 + i)
  183.                 abuf = fmt.Sprintf("| %2c ", c);
  184.             }
  185.             tbuf += abuf
  186.         }
  187.         tbuf += "|"
  188.         println(tbuf)
  189.     }
  190.     print("+---")
  191.     for i = 0; i < 8; i++ {
  192.         print("+----")
  193.     }
  194.     print("+")
  195.     println("")
  196.     println("")
  197.     for i = 0; i < 16; i++ {
  198.         sbuf = fmt.Sprintf("%-30s",  control[i])
  199.         tbuf = fmt.Sprintf("  %-34s",  control[i+16])
  200.         print(sbuf)
  201.         println(tbuf)
  202.     }
  203. }
  204. func main() {
  205.     if len(os.Args) > 1 &&  os.Args[1] == "-h" {
  206.         printUsage()
  207.         os.Exit(1)
  208.     }
  209.     makeTable()
  210. }




실행> go run makeAsciiTable.go

또는

컴파일> go build makeAsciiTable.go

실행> ./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)



 

Posted by Scripter
,