***文件目录***
文件 main.go
```
package main
import (
"bufio"
"fmt"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
_ "io"
"io/ioutil"
_ "log"
"os"
"path/filepath"
_ "strings"
)
// var le *walk.LineEdit
// var sport *walk.CheckBox
type MyMainWindow struct {
*walk.MainWindow
edit_fileName *walk.TextEdit
edit_fileName_flag bool
edit_Key *walk.TextEdit
Label *walk.LinkLabel
fileName string
}
func main() {
mw := &MyMainWindow{}
err := MainWindow{
AssignTo: &mw.MainWindow,
Title: "文件选择框对话框",
MinSize: Size{Width: 300, Height: 200},
MaxSize: Size{Width: 600, Height: 200},
Size: Size{Width: 600, Height: 200},
Layout: VBox{},
Children: []Widget{
GroupBox{
Layout: HBox{},
Children: []Widget{
LinkLabel{
Text: "文件路径:",
MinSize: Size{Width: 60, Height: 20},
MaxSize: Size{Width: 60, Height: 20},
},
TextEdit{
Text: "请选择文件",
AssignTo: &mw.edit_fileName,
MinSize: Size{Width: 400, Height: 20},
MaxSize: Size{Width: 400, Height: 20},
},
PushButton{
Text: "打开文件",
MinSize: Size{Width: 60, Height: 40},
MaxSize: Size{Width: 60, Height: 40},
OnClicked: mw.selectFile,
},
},
MinSize: Size{Width: 550, Height: 60},
MaxSize: Size{Width: 550, Height: 60},
},
GroupBox{
Layout: HBox{},
Children: []Widget{
LinkLabel{
Text: "key:",
MinSize: Size{Width: 60, Height: 20},
MaxSize: Size{Width: 60, Height: 20},
},
TextEdit{
Text: "",
AssignTo: &mw.edit_Key,
MinSize: Size{Width: 400, Height: 20},
MaxSize: Size{Width: 400, Height: 20},
},
PushButton{
MinSize: Size{Width: 60, Height: 60},
MaxSize: Size{Width: 60, Height: 60},
Text: "解密",
OnClicked: mw.saveFile,
},
},
MinSize: Size{Width: 550, Height: 60},
MaxSize: Size{Width: 550, Height: 60},
},
LinkLabel{
Text: "执行结果",
AssignTo: &mw.Label,
MinSize: Size{Width: 550, Height: 60},
MaxSize: Size{Width: 550, Height: 60},
},
},
}.Create()
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
mw.Run()
}
func (mw *MyMainWindow) selectFile() {
dlg := new(walk.FileDialog)
dlg.Title = "选择文件"
dlg.Filter = "所有文件(*.*)|*.*"
mw.edit_fileName.SetText("")
mw.edit_fileName_flag = false
if ok, err := dlg.ShowOpen(mw); err != nil {
mw.edit_fileName.SetText("Error: File Open\r\n")
return
} else if !ok {
mw.edit_fileName.SetText("未选择文件\r\n")
return
}
mw.edit_fileName_flag = true
mw.fileName = dlg.FilePath
s := fmt.Sprintf(" %s\r\n", dlg.FilePath)
mw.edit_fileName.SetText(s)
}
//自己编写一个函数,接收两个文件路径 srcFileName dstFileName
func (mw *MyMainWindow) CopyFile(srcFileName string, dstFileName string) (written int, err error) {
content, err := ioutil.ReadFile(srcFileName)
if err != nil {
fmt.Printf("read file err=%v", err)
}
//打开dstFileName
dstFile, err := os.OpenFile(dstFileName, os.O_WRONLY|os.O_CREATE, 0666)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
}
defer dstFile.Close()
//通过dstFile, 获取到 Writer
writer := bufio.NewWriter(dstFile)
//输出内容
key := mw.edit_Key.Text()
encrypt_stream(content, len(content), key, 4096)
writer.Write(content)
writer.Flush()
return
}
func (mw *MyMainWindow) saveFile() {
if !mw.edit_fileName_flag {
mw.Label.SetText("通知【没有选择文件】")
return
}
if mw.edit_Key.TextLength() == 0 {
mw.Label.SetText("通知【没有输入key】")
return
}
//fileName := "F:\\桌面\\web下载\\123.xls"
filePwd, fileName := filepath.Split(mw.fileName)
outfileName := filePwd + "New" + fileName
_, err := mw.CopyFile(mw.fileName, outfileName)
if err != nil {
fmt.Println("ReadBlck err ", err)
mw.Label.SetText("执行失败")
return
}
mw.Label.SetText("通知【解密完成,文件名称为:" + outfileName + "】")
}
```
文件 NasHash.go
```
package main
import "strconv"
// #define HASH_INITVAL 0xdeadbeef
const (
HASH_INITVAL = 0xdeadbeef
)
// C #define rofine(word,shift) ((word << shift)|(word >>(32-shift)))
func rol32(word uint64, shift int64) uint64 {
return word<<shift | word<<(32-shift)
}
//C nashash2
func nashash2(a uint64, b uint64, c uint64) uint64 {
c = -rol32(b, 14)
a ^= b
a -= rol32(c, 11)
b ^= a
b -= rol32(a, 25)
c ^= b
c -= rol32(b, 16)
a ^= c
a -= rol32(c, 4)
b ^= a
b -= rol32(a, 14)
c ^= b
c -= rol32(b, 24)
return c
}
func encrypt_stream(data []byte, n int, key string, pos uint64) int {
intNum, _ := strconv.ParseInt(key, 10, 64)
int64Num := uint64(intNum)
var i int
var a uint64
var b uint64
var c uint64
a = HASH_INITVAL + 4 + uint64(int64Num)
b = HASH_INITVAL + 4 + uint64(int64Num)
c = HASH_INITVAL + 4 + uint64(int64Num)
a += pos
for i = 0; i < n; i++ {
byte1 := nashash2(a, b, c) & 0xFF
data[i] ^= byte(byte1)
a++
}
return 0
}
func decrypt_stream(data []byte, n int, key string, pos uint64) int {
intNum, _ := strconv.ParseInt(key, 10, 64)
int64Num := uint64(intNum)
var i int
var a uint64
var b uint64
var c uint64
a = HASH_INITVAL + 4 + uint64(int64Num)
b = HASH_INITVAL + 4 + uint64(int64Num)
c = HASH_INITVAL + 4 + uint64(int64Num)
a += pos
for i = 0; i < n; i++ {
byte1 := nashash2(a, b, c) & 0xFF
data[i] ^= byte(byte1)
a++
}
return 0
}
```
效果图
![hash.png](https://static.studygolang.com/200514/c140b1f9dba2d8d668571c04a833fef1.png)
有疑问加站长微信联系(非本文作者))