|
|
@@ -0,0 +1,193 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/binary"
|
|
|
+ "encoding/hex"
|
|
|
+ "fmt"
|
|
|
+ "hash/crc32"
|
|
|
+ "io"
|
|
|
+ "io/ioutil"
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "strconv"
|
|
|
+)
|
|
|
+
|
|
|
+func swab16(x uint16) uint16 {
|
|
|
+ return (x&0x00ff)<<8 | (x&0xff00)>>8
|
|
|
+}
|
|
|
+
|
|
|
+func swab32(x uint32) uint32 {
|
|
|
+ return (x&0x000000ff)<<24 | (x&0x0000ff00)<<8 | (x&0x00ff0000)>>8 | (x&0xff000000)>>24
|
|
|
+}
|
|
|
+
|
|
|
+func sumArr(arr []uint8) uint32 {
|
|
|
+ sum := uint32(0)
|
|
|
+ for _, val := range arr {
|
|
|
+ sum += uint32(val)
|
|
|
+ }
|
|
|
+ return sum
|
|
|
+}
|
|
|
+
|
|
|
+func calChecknum(_type string, datas []byte) uint32 {
|
|
|
+ if _type == "sum32" {
|
|
|
+ return sumArr(datas)
|
|
|
+ } else if _type == "crc32" {
|
|
|
+ return crc32.ChecksumIEEE(datas)
|
|
|
+ } else {
|
|
|
+ print("unKown type: " + _type)
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func getFileSize(filename string) (int64, error) {
|
|
|
+ fileinfo, err := os.Stat(filename)
|
|
|
+ if err != nil {
|
|
|
+ return 0, err
|
|
|
+ }
|
|
|
+ size := fileinfo.Size()
|
|
|
+ return size, nil
|
|
|
+}
|
|
|
+
|
|
|
+func ReadBinFile(_name string, _type string, _en string, _block int) {
|
|
|
+ FileName := filepath.Base(_name)
|
|
|
+ // FileType := filepath.Ext(_name)
|
|
|
+
|
|
|
+ InputFilePath := _name
|
|
|
+ OutputFilePath := FileName + "." + _type
|
|
|
+
|
|
|
+ inputFile, err := os.Open(InputFilePath)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ defer inputFile.Close()
|
|
|
+
|
|
|
+ outputFile, err := os.OpenFile(OutputFilePath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ defer outputFile.Close()
|
|
|
+
|
|
|
+ if _block > 0 {
|
|
|
+ buffer := make([]byte, _block)
|
|
|
+ for {
|
|
|
+ n, err := inputFile.Read(buffer)
|
|
|
+ if n > 0 {
|
|
|
+ // 计算分片的校验和
|
|
|
+ check := calChecknum(_type, buffer[:n])
|
|
|
+ // 写入分片内容+分片校验和
|
|
|
+ if _en == "big" {
|
|
|
+ binary.Write(outputFile, binary.BigEndian, buffer[:n])
|
|
|
+ binary.Write(outputFile, binary.BigEndian, check)
|
|
|
+ } else {
|
|
|
+ binary.Write(outputFile, binary.LittleEndian, buffer[:n])
|
|
|
+ binary.Write(outputFile, binary.LittleEndian, check)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ if err == io.EOF {
|
|
|
+ break // 文件读取完毕
|
|
|
+ }
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ data, err := ioutil.ReadAll(inputFile)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ // 写入全部内容
|
|
|
+ if _en == "big" {
|
|
|
+ binary.Write(outputFile, binary.BigEndian, data)
|
|
|
+ } else {
|
|
|
+ binary.Write(outputFile, binary.LittleEndian, data)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 读取文件内容到字节切片
|
|
|
+ inputFile, err = os.Open(InputFilePath)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+ defer inputFile.Close()
|
|
|
+ data, err := ioutil.ReadAll(inputFile)
|
|
|
+ if err != nil {
|
|
|
+ panic(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ check := calChecknum(_type, data[:])
|
|
|
+ // 写入源文件校验码
|
|
|
+ if _en == "big" {
|
|
|
+ binary.Write(outputFile, binary.BigEndian, check)
|
|
|
+ } else {
|
|
|
+ binary.Write(outputFile, binary.LittleEndian, check)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 大小端转换
|
|
|
+ var networkBytes [4]byte
|
|
|
+ if _en == "big" {
|
|
|
+ binary.BigEndian.PutUint32(networkBytes[:], check)
|
|
|
+ } else {
|
|
|
+ binary.LittleEndian.PutUint32(networkBytes[:], check)
|
|
|
+ }
|
|
|
+ check_hex := hex.EncodeToString(networkBytes[:])
|
|
|
+
|
|
|
+ // 打印输出内容
|
|
|
+ size, err := getFileSize(InputFilePath)
|
|
|
+ fmt.Println(InputFilePath, fmt.Sprintf("%d", size), _type, check_hex)
|
|
|
+
|
|
|
+ // 关闭文件
|
|
|
+ err = outputFile.Close()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ }
|
|
|
+ // 重命名文件
|
|
|
+ out_name1 := FileName + "." + _type + "[" + check_hex + "]"
|
|
|
+ err = os.Rename(OutputFilePath, out_name1)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("重命名文件出错:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+ // parser.add_argument("n", help="bin文件名,譬如 COAB21232D.bin")
|
|
|
+ // parser.add_argument("-t", help="校验方式:sum32,crc32, 默认sum32")
|
|
|
+ // parser.add_argument("-e", help="校验码大小端:little,big, 默认little")
|
|
|
+ // parser.add_argument("-s", help="分块大小:0,1024,2048, 默认0不分块")
|
|
|
+
|
|
|
+ // 参数解析
|
|
|
+ // var _name = flag.String("n", "COAB21232D.bin", "bin文件名,譬如 COAB21232D.bin")
|
|
|
+ // var _type = flag.String("-t", "sum32", "校验方式:sum32,crc32, 默认sum32")
|
|
|
+ // var _en = flag.String("-e", "little", "校验码大小端:little,big, 默认little")
|
|
|
+ // var _block = flag.Int("-s", 0, "代理,譬如 分块大小:0,1024,2048, 默认0不分块")
|
|
|
+ // // 解析命令行参数
|
|
|
+ // flag.Parse()
|
|
|
+
|
|
|
+ _name := ""
|
|
|
+ _type := "sum32"
|
|
|
+ _en := "little"
|
|
|
+ _block := 0
|
|
|
+ for i, num := range os.Args[1:] {
|
|
|
+ switch i {
|
|
|
+ case 0:
|
|
|
+ _name = num
|
|
|
+ case 1:
|
|
|
+ _type = num
|
|
|
+ case 2:
|
|
|
+ _en = num
|
|
|
+ case 3:
|
|
|
+ numInt, err := strconv.Atoi(num)
|
|
|
+ if err != nil {
|
|
|
+ // 处理转换错误
|
|
|
+ fmt.Println("转换错误:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ _block = numInt
|
|
|
+ default:
|
|
|
+ fmt.Println("未知参数")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ReadBinFile(_name, _type, _en, _block)
|
|
|
+}
|