go - 从文件中读取字符串、整数和字节

标签 go

我必须使用 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++
}

https://play.golang.org/p/-rOJb_WlFf

关于go - 从文件中读取字符串、整数和字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43784825/

相关文章:

go - 使用结构成员而不是结构本身

使用本地文件进行测试

Golang rest api并发

go - goroutines 的意外输出

sql - If/Else 语句中的 Golang Postgres 语法错误

go - 对于返回值的方法,Golang 中没有 'return'

go - 有没有一种方法可以计算Go模板?

go - 是否有查找完整文件权限的功能?

go - 从 Go 执行第三方二进制文件

Go,是否可以将 defer 放在子函数中