C언어 Bin파일을 읽어서 특정 문자열 23글자 (버전정보) 추출

hok1019의 이미지

c언어 fopen, fread 함수를 이용해 약 1Mb의 bin파일들을 읽어서
23글자의 버전정보에 대한 데이터를 추출하여 배열에 넣으려고 합니다.

이 때, 버전정보에 대한 부분이 임의의 위치에 있다보니 위치를 지정해서 읽어올 수가 없고
버전정보가 bin파일마다 다르기 때문에 특정문자열을 판단해서 읽어올 수도 없는 상황입니다.

그나마 발견한 규칙이 Demo 1.0 0 0 이라는 문자열 뒤부터 버전정보가 나오는데(첨부그림 참고 부탁드립니다)
이러한 문자열 뒤부터 저장하려면 파일을 몇바이트씩 읽어와야 하며,
어떻게 버퍼에서 문자열 추출을 할 지 감이 안와 접근조차 못하고 있습니다.

파일마다 다른 위치에 있는 버전정보를 가져오려면 어떠한 방법으로 접근을 해야 할까요??

bin파일 내용 두 개 골라서 첨부하겠습니다.

File attachments: 
첨부파일 크기
Image icon 캡처.jpg304.8 KB
Image icon 캡처2.jpg339.3 KB
익명 사용자의 이미지

grep -a

hok1019의 이미지

다만, 특정 문자열이 고정값이 아니라 파일마다 위치와 내용이 다른 23글자 문자열인데
그 앞에 문자를 보고 뒷부분 23글자를 판단하고 싶습니다.

라스코니의 이미지

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로 계속 이동해야겠네요.

지나가다.의 이미지

문자열을 이진 파일로 저장한 후에, Demo 1.0 0 0 를 찾은 후, 다음의 문자열 Version X를 출력하는 예입니다.

#include <stdio.h>
#include <string.h>
 
int main(void){
	FILE *fp;
	char *string="정구업진언수리수리마하수리수수리사바하 Demo 1.0 0 0 Version X";
	char *version="Demo 1.0 0 0 ";
	char buffer[100];
	int i;
 
	fp=fopen("data.bin", "w+");
	fwrite(string, strlen(string)+1, 1, fp);
 
	i=0;
	while(1){
	    fseek(fp, i, SEEK_SET);
	    fread(buffer, strlen(version), 1, fp);
	    i++;
	    if(!strcmp(buffer, version)) break;
	}
 
	fread(buffer, 10, 1, fp);
	printf("%s\n", buffer);
 
	fclose(fp);
	return 0;
}
흠...의 이미지

물 1L 1000번 뜨러 가지 마시고
한번에 1000L 떠 오세요~
케파 충분합니다~

지나가다.의 이미지

물 1000린터인지 1리터이인지 어찌 알고요. 괜히 1씩 받는 것이 아니겠지요.

지나가다.의 이미지

이진검색이니 뭐니, 그런 얘기 할 줄 알았는데....

Anti-Lock의 이미지

물을 얼마나 많이 뜨러 가든지 간에 그게 온전히 성공했는지도 체크해야 합니다.
퍼펙트한 코드를 작성하는것은 생각보다 번거로울수 있습니다.

"효율적이지만 헛점이 있는 코드" vs "비효율적으로 보이지만 헛점은 없는 코드"

둘중에 어느것을 선호하세요? 물론 위의 예시 코드는 둘다 아닌거 같습니다만,
질문하신분에게 결정적인 힌트를 드리는 의미가 있죠.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.