2011年3月13日日曜日

Go言語でbase64デコード処理

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 件のコメント:

コメントを投稿

人気ブログランキングへ にほんブログ村 IT技術ブログへ