Go言語の練習その3として、base64デコード処理を書いてみました。と言っても、添付ライブラリを使っているだけですが。
// my_b64decode.go
package main
import (
"fmt"
"os"
"bufio"
"regexp"
"encoding/base64"
)
func err_exit(err os.Error) {
fmt.Fprintf(os.Stderr,"ERROR: %s\n", err.String())
os.Exit(1)
}
func my_chop(s string) string {
return s[0:len(s)-1]
}
func main() {
if len(os.Args) <= 1 {
fmt.Fprintf(os.Stderr, "Usage: my_b64decode file\n")
os.Exit(1)
}
f,err := os.Open(os.Args[1], os.O_RDONLY, 0666)
if err != nil { err_exit(err) }
b_rd := bufio.NewReader(f)
dst := make([]byte, 100, 200)
b_wr,err := bufio.NewWriterSize(os.Stdout, 4096)
if err != nil { err_exit(err) }
INPUT: for {
line,err := b_rd.ReadString('\n')
if err != nil {
if err == os.EOF {
break
}
err_exit(err)
}
m,err := regexp.MatchString("^begin-base64 ", line)
if ! m { continue }
for {
line,err := b_rd.ReadString('\n')
if err != nil {
if err == os.EOF {
break INPUT
}
err_exit(err)
}
m,err := regexp.MatchString("^====\n", line)
if m {
break INPUT
}
src := []byte(my_chop(line))
n,err := base64.StdEncoding.Decode(dst, src)
b_wr.Write(dst[0:n])
}
}
b_wr.Flush()
f.Close()
return
}
uuencode -m で作成された base64 エンコードファイルを読み込み、デコードして標準出力へ出力します。動作確認結果を示します。
[user00@fedora14 ~]$ ls -l /etc/services
-rw-r--r--. 1 root root 651949 Nov 12 20:56 /etc/services
[user00@fedora14 ~]$ uuencode -m /etc/services a.uu > a.uu
[user00@fedora14 ~]$ ls -l a.uu
-rw-rw-r-- 1 user00 user00 883783 Mar 13 22:56 a.uu ※テストファイルを用意
[user00@fedora14 ~]$ head -2 a.uu
begin-base64 644 a.uu
IyAvZXRjL3NlcnZpY2VzOgojICRJZDogc2VydmljZXMsdiAxLjUxIDIwMTAv
[user00@fedora14 ~]$ 6g my_b64decode.go
[user00@fedora14 ~]$ 6l -o my_b64decode my_b64decode.6
[user00@fedora14 ~]$ ./my_b64decode a.uu | md5sum
77a7f18fe1508eec6c0f2b5e15b8804e -
[user00@fedora14 ~]$ md5sum /etc/services
77a7f18fe1508eec6c0f2b5e15b8804e /etc/services ※元ファイルと等しい
[user00@fedora14 ~]$ uudecode -o - < a.uu | md5sum
77a7f18fe1508eec6c0f2b5e15b8804e - ※いちおうの確認
この練習では、次の3点についても学びました。
・正規表現ライブラリ
・chop() は無いらしい
・二重ループ脱出の方法(break のラベル指定)
0 件のコメント:
コメントを投稿