2

私は Go を学んでいて、ファイルの最初の 4 バイトを読み込もうとしています。探している特定のファイル ヘッダーがファイルに含まれているかどうかを確認したいと考えています。ただし、私のコードは期待するバイト数を表示しません。次のコードが機能しない理由を知っている人はいますか? いくつかのバイトを読み取りますが、それらは私が認識した、または期待したバイトではありません。実行するたびに同じなので、ランダムでも何でもないので、おそらく何か他の何かへのポインターです。

また、エラーを無視していることに気づきましたが、これは、これが機能していないときにハックモードに入り、問題に取り掛かろうとして、できる限り多くのクラフトを削除したためです。

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)

}
4

1 に答える 1

6

「9876」で始まる入力ファイルに対してコードを実行すると、次のようになります。

取得: &{識別子:[57 56 55 54]}

「1234」で始まる入力ファイルに対して実行すると、次のようになります。

取得: &{識別子:[49 50 51 52]}

私にとって、プログラムは期待どおりに動作します。システムで何か問題が発生しているか、ファイルの最初の 4 バイトの 10 進数値を取得していることに気付いていません。ヘックスを期待していましたか?それとも、何らかのエンコーディングに従ってバイトが解釈されることを期待していましたか (たとえば、ASCII または UTF-8 では、「57 56 55 54」ではなく「9 8 7 6」が表示されます)。

今後の参考のために (または、これで質問の答えが得られなかった場合)、これらの状況では、入力ファイル、システムで取得した出力、および期待した出力を含めると役立ちます。「それらは、私が認識した、または見ようとしていたバイトではありません」ということは、多くの可能性を残しています。

于 2013-05-23T23:34:26.963 に答える