흐르는 시간의 블로그...

아주 작은 프로젝트가 하나 생겼다.

파일에서 특정 데이터를 추출해내는 것이다.

기본적으로는 mpeg의 기본 구조를 따르는 것으로 보인다

go lang으로 작업을 진행하면서 보이는 자잘한 문제를 기술한다.


첫번째는 binary file에서 binary 데이터를 읽어 struct에 넣는 것이다

아래 코드와 같이 코딩하고 진행을 하면 이 지점에서 panic이 발생한다

err = binary.Read(buf, binary.LittleEndian, &riffHeader)

아래 코드중에 Header struct를 int32의 변수 세개(A,B,C)로 변경하면 정상 작동한다.
4 byte의 array로 read하는 부분에서 문제를 발생시키는 것으로 보인다.

결론은 역시...  stack overflow에서 찾았다


일단 소문자로 했을때는 패닉의 내용이 아래와 같다
using value obtained using unexported field

unexported 필드를 이용해서 값을 얻었다는 것이다.
패닉의 내용을 잘 이해했으면 더 빨리 풀었을지도 모를 일이다.

결국 header의 필드가 소문자로 시작하는 private였기 때문에 해당 값을 설정하지 못한것으로 이해된다.
해당 필드값들을 시작할때 대문자로 시작하면 문제가 해결된다.
다시 한번 느끼지만 에러문자열을 잘 읽어보자. ^^

package main

import (
	"os"
	"bytes"
	"encoding/binary"
	"fmt"
)

type Header struct {
	//A int32
	//B int32
	//C int32
	sID   [4]byte
	size  uint32
	stype [4]byte
}

func readFile(filename string) {
	f, err := os.Open(filename)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	b := make([]byte, 12)
	readsize, err := f.Read(b)
	if ( len(b) != readsize || err != nil) {
		panic(err)
	}

	riffHeader := Header{}
	buf := bytes.NewBuffer(b)
	err = binary.Read(buf, binary.LittleEndian, &riffHeader)
	if err != nil {
		fmt.Println("binary.Read failed:", err)
	}
}

func main() {
	readFile("e:/temp/20161101_105118_GE_2.avi")
}