我必须使用Go读取其数据已加密(元数据未加密)的PPM文件,并且文件格式包含:
" P3"幻数(读为字符串)
图像宽度(读为整数)
图像高度(读为整数)
最大颜色值(读为整数)
然后,我需要读取文件的其余部分是加密位,我必须将其读作单字节数组/切片。
e.g:
P6
480 360
255
�š��GHFHFI�GHFHFG~EG~EG~E
...
HFD{BR�Rz�y|�vxyyhlf%8&NFzx
从文件中读取字符串和整数(4个初始元数据值)和其余(加密部分)作为字节的好方法是什么?它可以是最有效的,但最干净(较少的线)是首选。
答案 0 :(得分:1)
您可以使用bufio.Reader使用ReadLine或ReadString方法阅读前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.Scanner与bufio.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++
}