您可以使用bufio.Reader读取用ReadLine或ReadString方法和使用方法Read读取文件的剩余部分的前3行。
阅读前3行后,可以使用strings包分割第二行,然后使用strconv包将包含数字的字符串解析为整数。
例如:
r := bufio.NewReader(file)
line1, err := r.ReadString('\n')
if err != nil {
panic(err)
}
// repeat to read line 2 and 3
size := strings.Split(line2, " ")
width, err := strconv.Atoi(size[0])
if err != nil {
panic(err)
}
height, err := strconv.Atoi(size[1])
if err != nil {
panic(err)
}
// repeat with line 3
更新:
正如Adrian在评论中提到的,你可以同时使用bufio.Scanner与bufio.ScanWordSplitFunc
扫描的元数据。
s := bufio.NewScanner(r)
s.Split(bufio.ScanWords)
var count int
for s.Scan() && count < 4 {
switch count {
case 0:
magic = s.Text()
case 1:
if width, err = strconv.Atoi(s.Text()); err != nil {
return
}
case 2:
if height, err = strconv.Atoi(s.Text()); err != nil {
return
}
case 3:
if color, err = strconv.Atoi(s.Text()); err != nil {
return
}
}
count++
}
https://play.golang.org/p/-rOJb_WlFf
是在一个字符串表示的整数,或者是他们的二进制?他们的尺寸是多少,或者他们的划分方式如何?如果它们是二进制的,那么是大端序列还是小端序列? – JimB
我认为从spakin/netpbm的家伙有一个非常简洁的方式,使用bufio为netpbm文件提取元数据部分(请参阅他们的[github-repo](https://github.com/spakin/netpbm/blob/master/netpbm .go)) – skymon
@JimB我给出的例子是从一个真实文件中提取的。元数据写在例子“P6 \ n480 360 \ n255 \ n”中,其余(数据)只是字节。它全部用utf-8编码。 –