read binary data from binary file and copy to struct
프로그래밍???/Go Lang2017. 2. 1. 11:49
아주 작은 프로젝트가 하나 생겼다.
파일에서 특정 데이터를 추출해내는 것이다.
기본적으로는 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") }
'프로그래밍??? > Go Lang' 카테고리의 다른 글
Defer를 이용한 코딩 패턴 - Deferred closure (0) | 2017.11.24 |
---|---|
필드 이름 없이 선언하는 것을 막아주는 방법 (0) | 2017.10.11 |
GOLANG 첫번째 프로젝트 완료! (0) | 2017.02.06 |
인터페이스와 메서드 집합 그리고 포인터 (0) | 2017.01.12 |
테스트 프로젝트 시작 (0) | 2017.01.05 |