golang:从文件

时间:2017-05-04 13:53:19

标签: go

我必须使用Go读取其数据已加密(元数据未加密)的PPM文件,并且文件格式包含:

  • " P3"幻数(读为字符串)

  • 图像宽度(读为整数)

  • 图像高度(读为整数)

  • 最大颜色值(读为整数)

然后,我需要读取文件的其余部分是加密位,我必须将其读作单字节数组/切片。

e.g:

P6
480 360
255
�š��GHFHFI�GHFHFG~EG~EG~E
...
HFD{BR�Rz�y|�vxyyhlf%8&NFzx

从文件中读取字符串和整数(4个初始元数据值)和其余(加密部分)作为字节的好方法是什么?它可以是最有效的,但最干净(较少的线)是首选。

1 个答案:

答案 0 :(得分:1)

您可以使用bufio.Reader使用ReadLineReadString方法阅读前3行,并使用Read方法读取文件的其余部分。

在您阅读了前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.Scannerbufio.ScanWord SplitFunc一起使用来扫描元数据。

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