2017-05-04 32 views
2

整数,字节我要读一个PPM文件,它的数据加密(元数据是不加密的),用围棋和文件格式,是给我含:golang:读字符串,从文件

  • 的 “P3” 幻数(读作字符串)

  • 图像宽度(读作整数)

  • 图像高度(读作整数)

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

然后,我需要读取文件的其余部分是加密比特,我要读作为一个单一的字节数组/片。

例如为:

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

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

+0

是在一个字符串表示的整数,或者是他们的二进制?他们的尺寸是多少,或者他们的划分方式如何?如果它们是二进制的,那么是大端序列还是小端序列? – JimB

+0

我认为从spakin/netpbm的家伙有一个非常简洁的方式,使用bufio为netpbm文件提取元数据部分(请参阅他们的[github-repo](https://github.com/spakin/netpbm/blob/master/netpbm .go)) – skymon

+0

@JimB我给出的例子是从一个真实文件中提取的。元数据写在例子“P6 \ n480 360 \ n255 \ n”中,其余(数据)只是字节。它全部用utf-8编码。 –

回答

1

您可以使用bufio.Reader读取用ReadLineReadString方法和使用方法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.Scannerbufio.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

+0

我以前尝试过这种方法,但问题是:在PPM文件格式中,元数据本身之间以及元数据和图像数据之间可以使用任何空格。 所有的元数据可以写在一行(“P3 480 360 255”)或任何空格的组合,不一定是换行符,我想覆盖所有的情况。 –

+0

如果分隔符不一致,扫描仪将提供您需要的灵活性:https://golang.org/pkg/bufio/#Scanner – Adrian

+0

@GabrielCalixto我已经使用'bufio.Scanner'添加了一个示例,正如@阿德里安。 – mkopriva

相关问题