美文网首页
extract bin

extract bin

作者: 风铃草613 | 来源:发表于2019-10-26 15:11 被阅读0次
    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()
    }
    

    相关文章

      网友评论

          本文标题:extract bin

          本文链接:https://www.haomeiwen.com/subject/spwwdctx.html