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.
'프로그래밍 > Go' 카테고리의 다른 글
Go 1.2 설치 후 에러 메시지(pack: cannot open $WORK\command-line-arguments\_obj\_go_.8) 해결하기 (0) | 2014.03.02 |
---|---|
Go 언어로 평방근, 입방근, n제곱근 구하는 함수를 구현하고 테스트하기 (0) | 2013.01.12 |
Go 언어로 역삼각함수, 역쌍곡선함수 값을 구하는 예제 (0) | 2013.01.01 |
Go 언어로 30!(30팩토리얼) 까지 정확하게 계산하기 (0) | 2012.06.29 |
Go 언어로 복소수 계산하기 (0) | 2012.06.28 |