본문으로 바로가기

문자 데이타 변환 Trf

category 카테고리 없음 2024. 5. 21. 15:20

홈페이지 : http://www.oche.de/~akupries/soft/trf/index.html

Trf는 문자 데이터의 변환을 중심으로 한 각종 커맨드를 제공하고 있는 패키지입니다. Tcl의 확장 라이브러리인 Trf는, Andreas Kupriesdp에 의해 개발이 되었으며, 최근에 Tcl 코어 개발팀에 합류했습니다. 현재의 최신버전은 2.1p2입니다.

TrfCrypt

이전 버전의 Trf에는 현재 버전과 비교하여, 암호화에 관련된 커맨드가 포함되어 있었습니다. 하지만 미국의 수출규제에 대한 배려를 위해, 현재는 TrfCrypt 패키지로써 동일한 싸이트에서 제공되고 있습니다.

텍스트 데이타 변환 커맨드

  • bin
  • oct
  • hex
  • uuencode
  • base64

이 밖에도 다른 것들도 있지만, 유용하게 사용할 수 있는 커맨드입니다. 이 커맨드는 텍스트 데이터를 2진수, 8진수, 16진수, uuencode, base64의 각 형식으로 인코딩/디코딩 목적의 커맨드입니다. 사용방법은 전부 동일합니다.

# encode 
set result [bin -mode encode $source]
# decode 
set result [bin -mode decode $source]

-mode는 데이타 보다 반드시 먼저 지정해야 합니다. 아래의 간단한 예를 보도록 하겠습니다.

package require Trf
 
set s  "Hello, Trf World."
set b1 [bin -mode encode $s]
set o1 [oct -mode encode $s]
set h1 [hex -mode encode $s]
set u1 [uuencode -mode encode $s]
set b641 [base64 -mode encode $s]
puts "$b1\n$o1\n$h1\n$u1\n$b641\n"
set b2 [bin -mode decode $b1]
set o2 [oct -mode decode $o1]
set h2 [hex -mode decode $h1]
set u2 [uuencode -mode decode $u1]
set b642 [base64 -mode decode $b641]
puts "$b2\n$o2\n$h2\n$u2\n$b642\n"
# end.

실행결과는 아래와 같습니다.

 

uuencode와 Base64는 원래 이메일상의 이미지같은 바이너리 데이터를 송신할 때에, 아스키(ASCII) 문자로 된 텍스트 변환 목적으로 만들어진 코드로, uuencode는 유닉스에서, Base64는 윈도즈에서 주로 사용되고 있습니다. 요즘은 메일러가 자동으로 송/수신 시에 변환/복원을 해주는 것이 대다수 이기 때문에 사실 이 부분은 모르셔도 됩니다. 그리고 Tcllib 강좌에서도 설명을 했던 부분으로 넘어가도록 하겠습니다.

데이터 압축 커맨드

  • zip
  • bz2

위의 두 커맨드는 gzip, bzip2로 알려진 파일 압축 프로그램과 상호 호환성이 있는 알고리즘으로 문자열의 압축/복원을 하는 커맨드입니다. 사용 방법은 간단합니다. bz2도 마찬가지입니다.

# encode 
set result [zip -mode compress $source]
# decode 
set result [zip -mode decompress $source]

-level 옵션으로 압축 레벨을 지정하는것도 가능합니다. 이것에 관한 자세한 사항은 gzip이나, bzip2의 문서를 보시면 됩니다. 예제로 아래와 같이 간단한 압축/복원 스크립트를 작성해 보았습니다.

package require Trf
 
proc decodeFile {infile a} {
   regsub "$a\$" $infile "" outfile
   if {[file exists $outfile]} {
      puts stderr "mm. $outfile already exists."; return
   }
   set fin  [open $infile r]
   set fout [open $outfile w]
   fconfigure $fin  -translation binary
   fconfigure $fout -translation binary
   set b [read $fin]
   close $fin
   if {$a == ".gz"} {
      set b2 [zip -mode decompress $b]
   } else {
      set b2 [bz2 -mode decompress $b]
   }
   puts -nonewline $fout $b2
   close $fout
}
 
proc encodeFile {infile a} {
   set outfile "$infile$a"
   if {[file exists $outfile]} {
      puts stderr "mm. $outfile already exists."; return
   }
   set fin  [open $infile r]
   set fout [open $outfile w]
   fconfigure $fin  -translation binary
   fconfigure $fout -translation binary
   set b [read $fin]
   close $fin
   if {$a == ".gz"} {
      set b2 [zip -mode compress $b]
   } else {
      set b2 [bz2 -mode compress $b]
   }
   puts -nonewline $fout $b2
   close $fout
}
 
if {"[set infile [lindex $argv 0]]" == ""} {
   puts stderr "usage: $argv0 infile"
}
set a [file extension $infile]
switch $a {
   .gz {  decodeFile $infile $a }
   .bz2 { decodeFile $infile $a }
   default {
      encodeFile $infile .gz
      encodeFile $infile .bz2
   }
}
# end.

위와 같이 파일을 압축/복원한 경우에는 read커맨드로 원본 파일을 전부 읽어 zip이나 bz2커맨드로 변환하여 puts으로 쓰면 됩니다. 이때 configure 커맨드로 -transalation binary를 지정하여 바이너리 데이터를 정상적으로 다술수 있게 해줘야 합니다. 위의 스크립트는 gzip이나 bzip2 프로그램으로 압축한 프로그램과 상호 호환성이 없습니다. 이유는 gzip프로그램은 파일을 압축 시에 파일에 관한 정보를 파일의 헤더에 붙이는데, Trf의 zip 커맨드나 bz2 커맨드는 이 헤더를 처리하는 기능이 없기 때문입니다. 따라서 gzip 등으로 압축한 파일에 대하여 처리를 하는 것이 아니라, 독자적인 애플리케이션의 데이터를 압축하고 보존하는 등의 처리에 사용 시 좋습니다.

메시지 digest 커맨드

메시지 다이제스트 알고리즘 5 [ message digest algorithm 5, MD5 ]
RSA 암호 개발자(Rives)가 개발한 메시지 다이제스트 함수 알고리즘. RFC 1321에 규정되어 있다.
널리 사용되고 있는 알고리즘으로, 가장 일반적으로 사용되고 있는 간이 전자 우편 전송 프로토콜(SMTP)
서버 소프트웨어인 ‘sendmail’이나 도메인 네임 서버(DNS)의 사실상의 표준인 바인드(BIND) 소프트웨어
등의 인증에 사용된다. 일방향 해시 함수로서 임의 메시지를 압축, 고정 길이 해시값의 되돌림 처리는
32비트 단위로 한다. 주로 데이터의 오류 검출에 이용된다.
  • adler
  • crc
  • md5

인터넷 통신에 있어서, 수신 시의 데이터가 원본의 데이터와 완전히 동일한지를 검증하는 것은 상당히 중요한 일입니다. 이유는 파일 송/수신 시에 파일의 특정 영역이 인터넷 회선이나 기타 문제로 인하여 제대로 처리하지 못하는 경우가 발생하기 때문입니다. alder, crc, md5는 메시지 다이제스트를 생성하는 커맨드로, 사용 방법은 모두 동일하며, 단지 생성된 텍스트의 내용이 다를 뿐입니다. 어느 것이 뛰어나다고는 장담을 못하므로, 맘에 드시는 것을 사용하시면 됩니다. 그럼 아래의 간단한 텍스트를 메시지 다이제스트를 해보겠습니다.

This is a joy in the world, joy on your mind, joy of your control.
package require Trf
set s1 {\ 
This is a joy in the world, joy on your mind, joy of your control.}
set s2 {\ 
This is a joy in the world, joy on your mind: joy of your control.}
set s3 {\ 
This is a joy in the world, joy on your mind, joy of your control.}
set ad1 [adler $s1]; set cr1 [crc   $s1]; set md1 [md5   $s1]
set ad2 [adler $s2]; set cr2 [crc   $s2]; set md2 [md5   $s2]
set ad3 [adler $s3]; set cr3 [crc   $s3]; set md3 [md5   $s3]
puts "$ad1\n$cr1\n$md1\n"
puts "$ad2\n$cr2\n$md2\n"
puts "$ad3\n$cr3\n$md3"
# end.