C언어 Bin파일을 읽어서 특정 문자열 23글자 (버전정보) 추출
글쓴이: hok1019 / 작성시간: 월, 2019/09/16 - 5:02오후
c언어 fopen, fread 함수를 이용해 약 1Mb의 bin파일들을 읽어서
23글자의 버전정보에 대한 데이터를 추출하여 배열에 넣으려고 합니다.
이 때, 버전정보에 대한 부분이 임의의 위치에 있다보니 위치를 지정해서 읽어올 수가 없고
버전정보가 bin파일마다 다르기 때문에 특정문자열을 판단해서 읽어올 수도 없는 상황입니다.
그나마 발견한 규칙이 Demo 1.0 0 0 이라는 문자열 뒤부터 버전정보가 나오는데(첨부그림 참고 부탁드립니다)
이러한 문자열 뒤부터 저장하려면 파일을 몇바이트씩 읽어와야 하며,
어떻게 버퍼에서 문자열 추출을 할 지 감이 안와 접근조차 못하고 있습니다.
파일마다 다른 위치에 있는 버전정보를 가져오려면 어떠한 방법으로 접근을 해야 할까요??
bin파일 내용 두 개 골라서 첨부하겠습니다.
Forums:
grep -a
grep -a
답변감사합니다!
다만, 특정 문자열이 고정값이 아니라 파일마다 위치와 내용이 다른 23글자 문자열인데
그 앞에 문자를 보고 뒷부분 23글자를 판단하고 싶습니다.
fread()로 파일을 읽어서 'D'가 나올때까지
fread()로 파일을 읽어서 'D'가 나올때까지 읽는거죠. 'D'(0x44)가 나오면 그 다음에는 'e'(0x65)가 나오는지 보고, 계속 Demo 1.0 0 0 가 모두 맞을 때까지 비교하면 됩니다. 중간에 맞지 않으면 다시 'D'가 나올때까지 읽고요. 일종의 sync (synchronization) code 맞추기 같은 것이죠.
Demo 1.0 0 0가 모두 맞았으면 그 뒤에 23 byte를 읽으면 되고요.
문제는 어떻게 배열을 선언할 것인가인데 Demo 1.0 0 0 와 비교할 수 바이트짜리 버퍼와, 23 byte를 읽을 버퍼가 필요하겠네요.
크기만큼 읽어서
Demo 1.0 0 0 를 문자열로 초기화하고, 이 크기만큼 fread로 읽은 후에, strcmp로 같은 가를 비교한 후에, 다르면 계속 읽고, 같으면 버전정보만큼의 바이트를 읽어 들이면 되겠지요.
fseek로 계속 이동해야겠네요.
fseek로 계속 이동해야겠네요.
대충 해봤어요.
문자열을 이진 파일로 저장한 후에, Demo 1.0 0 0 를 찾은 후, 다음의 문자열 Version X를 출력하는 예입니다.
....
물 1L 1000번 뜨러 가지 마시고
한번에 1000L 떠 오세요~
케파 충분합니다~
그건 일반적이지 않지요.
물 1000린터인지 1리터이인지 어찌 알고요. 괜히 1씩 받는 것이 아니겠지요.
나는
이진검색이니 뭐니, 그런 얘기 할 줄 알았는데....
물을 얼마나 많이 뜨러 가든지 간에 그게 온전히
물을 얼마나 많이 뜨러 가든지 간에 그게 온전히 성공했는지도 체크해야 합니다.
퍼펙트한 코드를 작성하는것은 생각보다 번거로울수 있습니다.
"효율적이지만 헛점이 있는 코드" vs "비효율적으로 보이지만 헛점은 없는 코드"
둘중에 어느것을 선호하세요? 물론 위의 예시 코드는 둘다 아닌거 같습니다만,
질문하신분에게 결정적인 힌트를 드리는 의미가 있죠.
댓글 달기