extract bin

2019-10-26  本文已影响0人  风铃草613
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()
}
上一篇下一篇

猜你喜欢

热点阅读