/
read.go
63 lines (55 loc) · 1.28 KB
/
read.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package PNGChunkModifie
import (
"bytes"
"encoding/binary"
"fmt"
"io"
"os"
)
func ReadData(file *os.File, matchChunk []byte) {
header := make([]byte, 8)
_, err := io.ReadFull(file, header)
if err != nil {
fmt.Println("Error reading PNG header:", err)
return
}
if string(header) != "\x89PNG\r\n\x1a\n" {
fmt.Println("Not a valid PNG file.")
return
}
// Read chunks
for {
var chunk Chunk
// Read chunk length
err := binary.Read(file, binary.BigEndian, &chunk.Length)
if err == io.EOF {
break
} else if err != nil {
fmt.Println("Error reading chunk length:", err)
return
}
// Read chunk type
_, err = io.ReadFull(file, chunk.Type[:])
if err != nil {
fmt.Println("Error reading chunk type:", err)
return
}
// Read chunk data
chunk.Data = make([]byte, chunk.Length)
_, err = io.ReadFull(file, chunk.Data)
if err != nil {
fmt.Println("Error reading chunk data:", err)
return
}
// Read CRC
err = binary.Read(file, binary.BigEndian, &chunk.CRC)
if err != nil {
fmt.Println("Error reading CRC:", err)
return
}
if bytes.Equal(chunk.Type[:], matchChunk) {
chunk.Data = bytes.Replace(chunk.Data, []byte("\x00"), []byte(":"), 1)
fmt.Printf("Chunk Type: %s, Data: %s\n", string(chunk.Type[:]), string(chunk.Data[:]))
}
}
}