Ryan
Ryan

Reputation: 7959

How to read the first four bytes of a file, using Go?

I'm learning Go, and am trying to read the first four bytes of a file. I'm wanting to check if the file contains a specific file header that I'm looking for. My code does not display the bytes that I'm expecting, though. Does anybody know why the following code might not work? It does read in some bytes, but they're not bytes I recognized or expected to see. They're not random or anything, because they're the same every time I run it, so it's probably a pointer to something else or something.

Also, I realize I'm ignoring errors but that's because I went into hack-mode while this wasn't working and removed as much of the cruft as I could, trying to get down to the issue.

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)

}

Upvotes: 2

Views: 1041

Answers (1)

Darshan Rivka Whittle
Darshan Rivka Whittle

Reputation: 34031

When I run your code against an input file beginning with "9876", I get:

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

When run against an input file beginning with "1234", I get:

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

For me, the program works as expected. Either something is going wrong on your system, or you don't realize that you're getting the decimal value of the first four bytes in the file. Were you expecting hex? Or were you expecting to see the bytes interpreted according to some encoding (e.g., ASCII or UTF-8, seeing "9 8 7 6" instead of "57 56 55 54")?

For future reference (or if this didn't answer your question), it's helpful in these situations to include your input file, the output you get on your system, and the output you expected. "They're not bytes I recognized or expected to see" leaves a lot of possibilities on the table.

Upvotes: 6

Related Questions