Go 언어 소스:

/*
 *  Filename: testHexView_02.go
 *
 *  Purpose:  Show Hexadecimal codes of the given binary file.
 *
 *  Execute:  go run testHexView_02.go [filename]
 *
 *  or
 *
 *  Compile:  go build testHexView_02.go
 *  Execute:  ./testHexView_02.go [filename]
 *
 *  Date: 2013. 8. 3.
 */

package main

import (
    "fmt"
    "os"
)

func print(str string) {
    fmt.Printf("%s", str);
}

func println(str string) {
    fmt.Printf("%s\n", str);
}

// 사용법 표시
func printUsage() { 
     println("Usage: go run testHexView_02.go [filename]");
}

func toHex(c int) string {
    var s string = "";
    var x1 int
    var x2 int
    x1 = (c & 0xF0) >> 4;
    x2 = c & 0x0F;
    if x1 < 10 {
        s += fmt.Sprintf("%c", x1 + '0');
    } else {
        s += fmt.Sprintf("%c", (x1 - 10) + 'A');
    }
    if x2 < 10 {
        s += fmt.Sprintf("%c", x2 + '0');
    } else {
        s += fmt.Sprintf("%c", (x2 - 10) + 'A');
    }
    return s
}

func toHex8(n int64) string {
    var s string = "";
    var x1, x2, x3, x4, x5, x6, x7, x8 int64
    x1 = (n & 0xF0000000) >> 28;
    x2 = (n & 0xF000000) >> 24;
    x3 = (n & 0xF00000) >> 20;
    x4 = (n & 0xF0000) >> 16;
    x5 = (n & 0xF000) >> 12;
    x6 = (n & 0xF00) >> 8;
    x7 = (n & 0xF0) >> 4;
    x8 = n & 0x0F;
    if x1 < 10 {
        s += fmt.Sprintf("%c", x1 + '0');
    } else {
        s += fmt.Sprintf("%c", (x1 - 10) + 'A');
    }
    if x2 < 10 {
        s += fmt.Sprintf("%c", x2 + '0');
    } else {
        s += fmt.Sprintf("%c", (x2 - 10) + 'A');
    }
    if x3 < 10 {
        s += fmt.Sprintf("%c", x3 + '0');
    } else {
        s += fmt.Sprintf("%c", (x3 - 10) + 'A');
    }
    if x4 < 10 {
        s += fmt.Sprintf("%c", x4 + '0');
    } else {
        s += fmt.Sprintf("%c", (x4 - 10) + 'A');
    }
    s += " "
    if x5 < 10 {
        s += fmt.Sprintf("%c", x5 + '0');
    } else {
        s += fmt.Sprintf("%c", (x5 - 10) + 'A');
    }
    if x6 < 10 {
        s += fmt.Sprintf("%c", x6 + '0');
    } else {
        s += fmt.Sprintf("%c", (x6 - 10) + 'A');
    }
    if x7 < 10 {
        s += fmt.Sprintf("%c", x7 + '0');
    } else {
        s += fmt.Sprintf("%c", (x7 - 10) + 'A');
    }
    if x8 < 10 {
        s += fmt.Sprintf("%c", x8 + '0');
    } else {
        s += fmt.Sprintf("%c", (x8 - 10) + 'A');
    }
    return s
}


 


// Go 언어의 실행 시작 지점
func main() {
    var i int
    var data []byte
    var fname string
    var fsize int64
    var c byte
    var n int64
    var m int
    var t string

    if len(os.Args) < 2 {
        printUsage()
        return
    }

    fname = os.Args[1]


    file, err := os.Open(fname)
    if err != nil {
        return
    }
    defer file.Close()
   
    // get the file size
    stat, err := file.Stat()
    if err != nil {
        return
    }
    fsize =  stat.Size()

    fmt.Printf("The size of the file \"%s\" is %d.\n\n", fname, fsize)

    for ; n < fsize; {
        fmt.Printf("%s: ", toHex8(n))
        t = ""

        data = make([]byte, 16)
        m, err = file.Read(data)
        if err != nil {
            return
        }

        for i = 0; i < m; i++ {
            c = data[i]
            if i != 7 {
                fmt.Printf(" %s", toHex(int(c)))
            } else {
                fmt.Printf("-%s", toHex(int(c)))
            }
            if c < byte(' ') || c > 0x7F {
                t += "."
            } else {
                t += string(c)
            }
        }
        for i = 0; i < 16 - m; i++ {
            fmt.Printf("   ")
            t += " "
        }
        fmt.Printf("  |%s|\n", t)

        n += int64(m)
    }

    fmt.Printf("\n")
    fmt.Printf("Read %d bytes.\n", n)

    return
}

 

 

실행하기 예 2> go run testHexView_02.go temp_1.bin
The size of the file "temp_1.bin" is 12.

0000 0000:  48 65 6C 6C 6F 20 74-68 65 72 65 0A              |Hello there.    |

Read 12 bytes.

 

실행하기 예 2> go run testHexView_02.go myFile.ser
The size of the file "myFile.ser" is 130.

0000 0000:  AC ED 00 05 73 72 00-06 50 65 72 73 6F 6E 07 31  |....sr..Person.1|
0000 0010:  46 DB A5 1D 44 AB 02-00 03 49 00 03 61 67 65 4C  |F...D....I..ageL|
0000 0020:  00 09 66 69 72 73 74-4E 61 6D 65 74 00 12 4C 6A  |..firstNamet..Lj|
0000 0030:  61 76 61 2F 6C 61 6E-67 2F 53 74 72 69 6E 67 3B  |ava/lang/String;|
0000 0040:  4C 00 08 6C 61 73 74-4E 61 6D 65 71 00 7E 00 01  |L..lastNameq.~..|
0000 0050:  78 70 00 00 00 13 74-00 05 4A 61 6D 65 73 74 00  |xp....t..Jamest.|
0000 0060:  04 52 79 61 6E 73 71-00 7E 00 00 00 00 00 1E 74  |.Ryansq.~......t|
0000 0070:  00 07 4F 62 69 2D 77-61 6E 74 00 06 4B 65 6E 6F  |..Obi-want..Keno|
0000 0080:  62 69                                            |bi              |

Read 130 bytes.

Posted by Scripter
,