我必须使用 Go 读取数据已加密(元数据未加密)的 PPM 文件,文件格式提供给我包含:
“P3”魔数(Magic Number)(读作字符串)
图像宽度(读作整数)
图像高度(读作整数)
最大颜色值(读作整数)
然后,我需要读取文件的其余部分是加密位,我必须将其作为单个字节数组/slice 读取。
例如:
P6
480 360
255
�š��GHFHFI�GHFHFG~EG~EG~E
...
HFD{BR�Rz�y|�vxyyhlf%8&NFzx
从文件中以字节形式读取字符串和整数(4 个初始元数据值)以及其余部分(加密部分)的好方法是什么?它可以是最有效的,但首选最干净(更少的行)。
最佳答案
您可以使用 bufio.Reader使用 ReadLine 读取前 3 行或 ReadString方法并使用 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++
}
关于go - 从文件中读取字符串、整数和字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43784825/