如何使用Go读取文件的前四个字节?

时间:2013-05-23 23:18:53

标签: go

我正在学习Go,我正在尝试读取文件的前四个字节。我想检查文件是否包含我正在寻找的特定文件头。但是,我的代码不会显示我期望的字节数。有谁知道为什么以下代码可能不起作用?它确实读取了一些字节,但它们不是我认可或预期会看到的字节。它们不是随机的,也不是任何东西,因为每次运行它们都是一样的,所以它可能是指向别的东西的指针。

另外,我意识到我忽略了错误,但那是因为我进入黑客模式而这不起作用并尽可能多地删除了这个问题,试图解决这个问题。

package main

import (

    "os"
    "io"
    "fmt"

)

type RoflFile struct {

    identifier []byte

}

func main() {

    arguments := os.Args[1:]

    if len(arguments) != 1 {

        fmt.Println("Usage: <path-to-rofl>")
        return

    }

    inputfile := arguments[0]

    if _, err := os.Stat(inputfile); os.IsNotExist(err) {

        fmt.Printf("Error: the input file could not be found: %s", inputfile)
        return

    }

    rofl := new(RoflFile)
    rofl.identifier = make([]byte, 4)

    // open the input file so that we can pull out data
    f, _ := os.Open(inputfile)

    // read in the file identifier
    io.ReadAtLeast(f, rofl.identifier, 4)

    f.Close()

    fmt.Printf("Got: %+v", rofl)

}

1 个答案:

答案 0 :(得分:6)

当我针对以“9876”开头的输入文件运行代码时,我得到:

Got: &{identifier:[57 56 55 54]}

当以“1234”开头的输入文件运行时,我得到:

Got: &{identifier:[49 50 51 52]}

对我来说,该程序按预期工作。您的系统上出现了问题,或者您没有意识到您正在获取文件中前四个字节的十进制值。你期待十六进制吗?或者您是否希望看到根据某些编码解释的字节(例如,ASCII或UTF-8,看到“9 8 7 6”而不是“57 56 55 54”)?

为了将来参考(或者如果这没有回答您的问题),在这些情况下包含输入文件,系统输出以及预期输出会很有帮助。 “它们不是我认识或预期会看到的字节”,在桌面上留下了很多可能性。