2017-03-25 1 views
0
char* full_string; 
int size; 
FILE* f = fopen(filename,"r"); 

fseek(f,0,SEEK_END); 
size = ftell(f); 
fseek(f,0,SEEK_SET); 
full_string = malloc(size+1); 
fread(full_string,1,size,f); 
fclose(f); 

full_string[size] = '\0'; 

위 코드를 사용하여 "full_string"이라는 버퍼에 파일의 내용을 읽으려고하지만 gdb를 단계별로 실행하면 다음 내용이 저장됩니다. 대신 "full_string" 버퍼에 이미지 파일 내용을 읽는 중

full_string = 0xa46df0 "\377\330\377", <incomplete sequence \340> 

내가 C에서 완전 초보, 그래서 내가 어떻게이 문제를 해석하는 아무 생각이 없습니다. 내가 읽고있는 파일이 이미지 파일이라는 것을 언급 할 가치가있다. 이러한 이미지의 대부분은 크기가 50,000 바이트 이상입니다. 어떤 도움이라도 대단히 감사하겠습니다!

+3

'full_string'에서 무엇을 기대합니까? 디버거가 문자 스트링으로 해석하려고 시도했지만 이미지가 문자열이 아닙니다. 따라서 * 코드 *가 좋을 수도 있지만 * 디버거 *는 혼란 스러울 수 있습니다. –

+0

@ScottHunter 또는 그냥 거대한 문자열을 표시 할 수 없습니다. – fvu

+0

"문자열"은 0으로 끝나며'char *'(또는'char * '로 붕괴되는'char []' 사물에 전달되었을 때). 매우 특정한 형식이 아닌 다른 것을 넣으면 문자열을 만들지 않고 일련의 바이트를 만듭니다. GDB는 문자열을 만들지 않는다는 것을 모릅니다. 어떻게 그럴 수 있니? 그래서 문자열이라고 가정하고 문자열로 해석 할 때 오류가 발생합니다. 문자열이 아니기 때문입니다. –

답변

0

char *은 자동으로 문자열을 의미하지 않습니다. C에서 문자열은 char * (또는 char []이 어딘가에 전달되었을 때 char *으로 붕괴되었지만이 답을 위해 같은 것으로 간주해 봅니다)에 저장된 바이트 시퀀스입니다. 이 일련의 바이트는 null 바이트 인 '\0'으로 끝나야하며 내부의 임의의 위치에 포함시키지 않아야합니다.

특정 파일을 16 진수 편집기에서 열면 FF D8 FF E0 00과 같은 것을 볼 수 있습니다. 나는 (a)가 8 진수 변환을 받았고 (b) 다른 바보 같은 실수를하지 않았다고 가정합니다. 파일에서 유효하지만, 예를 들어 strlen 또는 GDB에서 문자열로 해석하려고하면 ~ 50000 자 미만이므로 예상 값인 ~ 50000자를 얻을 수 없습니다 최초의 null 바이트의 전에 이것은 또한 "string"을 '\0'으로 끝내는 것이 의미가 없다는 것을 의미합니다. 내 말은, 그것은 이 아니고 문자열입니다. 그것은 일련의 바이트입니다.

길이가 중요한 경우 요구 사항에 따라 길이를 구조 또는 다른 변수에 저장해야합니다.

관련 문제