package main
import (
"encoding/binary"
"encoding/hex"
"flag"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
)
var (
srcFile string
srcFileDefault string = "L1_DUMP_0x00100000_0x02600000.bin"
addr int64
addrDefault int64 = 0x42d040
length int64
lengthDefault int64 = 15360 * 4 * 20
outputFile string
outputFileDefault string = "output.bin"
h bool
endianFlag bool = true
)
func init() {
flag.BoolVar(&h, "h", false, "this help")
flag.BoolVar(&endianFlag, "t", false, "true: 大小端与源文件一致, false: 转换大小端")
flag.StringVar(&srcFile, "i", srcFileDefault, "输入文件")
flag.Int64Var(&addr, "s", addrDefault, "数据起始地址")
flag.Int64Var(&length, "l", lengthDefault, "提取数据长度")
flag.StringVar(&outputFile, "o", outputFileDefault, "输出文件")
flag.Usage = usage
}
func usage() {
fmt.Fprintf(os.Stderr, `
*******************************************************************************
************* Func: extract file from TT output file **************************
************* Version: 1.0 **************************
************* Author: Ys.Zhao **************************
************* Date: 2019-9-11 **************************
*******************************************************************************
`)
flag.PrintDefaults()
}
func trunc_bin_file() {
startAddrString := strings.Split(srcFile, "_")[2]
startAddrString = strings.Split(startAddrString, "0x")[1]
// startAddrString = strings.TrimLeft(startAddrString, "0")
startAddrByte, err := hex.DecodeString(startAddrString)
if err != nil {
log.Fatal(err)
return
}
startAddrInt := binary.BigEndian.Uint32(startAddrByte[:])
seek := addr - int64(startAddrInt)
fileId, err := os.Open(srcFile)
if err != nil {
log.Fatal(err)
fmt.Println("generate output file fail, please check inputfile...")
}
content := make([]byte, length)
n, err := fileId.ReadAt(content, seek)
if err != nil && int64(n) != length {
log.Fatal(err)
fmt.Println("generate output file fail, please check inputfile...")
}
if !endianFlag {
for i := 0; i < len(content); i += 2 {
tmp := binary.LittleEndian.Uint16(content[i : i+2])
binary.BigEndian.PutUint16(content[i:i+2], tmp)
}
}
err = ioutil.WriteFile(outputFile, content, os.ModePerm)
if err != nil {
log.Fatal(err)
fmt.Println("generate output file fail, please check inputfile...")
}
}
func main() {
flag.Parse()
if h {
flag.Usage()
}
trunc_bin_file()
}
网友评论