2017-05-04 76 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

相關問題