Monday, March 28, 2011

binary 데이터 핸들링

요즘 binary 데이터를 처리할 일이 많이 생긴다. sff 파일도 그렇고 ab1파일도 그렇고. 단 한번도  binary 파일을 처리해보지 못한 나에겐 공포의 영역. 해서 함 해보기로 한다. 까짓거 사람이 만든건데 뭐 별거 있겠어.


우선은 누가 짜놓은 ab1 파일 파싱하는 프로그램을 봤는데 struct 모듈을 사용한다.

http://www.thegreatgoodplace.com/tt/study/316 (길원이형 블로그를 보게 될 줄이야...)


헌데 잘 이해가 안된다. 우선 쉬운 블로그를 찾아보자.

http://seorenn.blogspot.com/2011/02/python-struct-padding.html


음.. 때려 맞추자면 pack이 binary로 만들어 주는거고 unpack이 binary로 된걸 python 형식의 string으로 바꿔주는듯.. padding이란 말이 나오는데 뭐 % operator에 숫자 붙인 것처럼 데이터가 특정 사이즈만큼 안될 때 0 bit로 넣어주는거 같고.. 음.. 생각해보니 binary 라는게 그냥 데이터가 틈(?) 없이 계속 나열되어 있는 것이겠군. 그렇다면 파일 format 그러니까 몇바이트까지가 하나의 데이터고 또 몇바이트까지가 하나의 데이터고 이런 정해진 포멧만 알고 특정 바이트까지로 구분해서 읽으면 그게 데이터가 되겠다는 생각이 든다. 아닐수 있지만.. 여튼


이제 struct 모듈의 full 설명을 볼 차례다.
http://docs.python.org/library/struct.html
pack이랑 unpack은 위에서 말한거랑 같고 pack_into랑 unpack_from 이 있는데 이는 특정 buffer에서 offset 값서 부터 읽거나 쓰는거 같은거..  
byte order, size, and alignment 아.. 요것이 중요한거 같은데. format 의 첫 character가 @,=,<,>,!(!는 poor souls을 위한 거란다. 나인가 보다 네트워크는 big인걸 까먹는 나) 중에 하나 선택하는건데 이게 byte order, size, alignment를 뭘로 할거냐. 그러니까 native 라 함은 하드웨어 특유의 방식 byte order 같은 경우에는 intel cpu의 경우 little endian 이다 뭐 이런거 뜻하는 걸거고(확인하려면 sys.byteorder를 사용하란다).. size는 링크 안에 표가 있다. 아.. 근데 alignment가 뭔지 모르겠다.. 뭐지 이거.. 아. 예제를 보아하니 format이 다른 연속의 데이터가 있을때 이를 맞춰주는거를 alignment라고 하는거 같은데 정확하지 않다.




첫 url 링크의 프로그램을 보면 ab1 파일의 binary format과 프로그램이 있는데 struct를 알고보면 굉장히 프로그램이 단순다하는 걸 알게 된다. 다만 전부 unpack의 format이 big-endian 인데 이는 ab1 파일 자체가 그렇게 되어 있기 때문에.


아 그리고 전에 포스팅 했던 bit 연산자도 다시 볼 필요가 있겠다.
http://graphy21.blogspot.com/2010/10/bit.html