2013-10-20 7 views
0

다음 코드에서는 길이가 7 바이트 인 버퍼를 만들고 버퍼에 char 배열과 함께 네트워크 바이트 순서로 정수를 넣으려고합니다. 내 sprintf() 버퍼의 끝에서 Null 문자가 없어야하므로 memcpy()을 사용하여 7 바이트 만 복사합니다. 그러나, 나는 memcpy() 이후 다른 버퍼를 받고있는 것 같습니다.memmove가 버퍼의 모든 내용을 복사하지 않음 - C

코드 :

int num = 1234; 
char *dummy = "bla"; 
int dummy_len = strlen(dummy); 
int buffer_len = sizeof(int) + dummy_len; 
char *buffer = malloc(buffer_len); 
char *temp_buf = malloc(buffer_len); 
size_t len = buffer_len; 

sprintf(temp_buf, "%d%s",htonl(num),dummy); //preparing the temp_buf 
memmove(buffer, temp_buf, len); 
printf("sizeof(temp_buf) = %d and sizeof(buffer) = %d\n",sizeof(temp_buf), sizeof(buffer)); 
printf("printing buffer = %s and temp_buf = %s\n", buffer,temp_buf); 

나는 다음과 같은 출력을 받고 있어요 :

sizeof(temp_buf) = 4 and sizeof(buffer) = 4 
printing buffer = -771489 and temp_buf = -771489792bla 

답변

1

:

당신은 같은 것을 사용한다.

int temp = htonl(num); 
memmove(buffer, &temp, sizeof(temp)); 
memmove(buffer+sizeof(temp), dummy, strlen(dummy)); 
+0

예, 올바르게 작동합니다. 테스트 해 보았습니다. –

1

sizeof(int)를 사용하고 sprintf(...,"%d... 모든 4 바이트 정수 소수점 4 자리로 인쇄 모순이다.

특히 htonl(num)은 4 자리 십진수로 인쇄하지 않을 가능성이 있습니다. 따라서 sprintf()은 버퍼 오버플로 temp_buf입니다. 당신은 단지 데이터를 직접 복사 sprintf를 필요하지 않습니다

uint32_t n = htonl(num); 
memcpy(temp_buf, &n, sizeof(n)); 
+0

예 방금 len = 13을 사용했으며 버퍼 내용이 동일합니다. 좋아, 4 바이트의 크기를 유지하면서 int를 네트워크 바이트 순서로 변환 할 수있는 대체 방법이 있습니까? –

+0

@ZahaibAkhtar 인쇄 가능한 문자열을 얻으려고하지 않는다면,'memcpy()'가 잘 동작해야합니다. 어떠한 이유로 인쇄 가능한 문자열을 얻거나 10 진수로 제한해야하는 경우 계수 인수로 -2^31에서 2^31-1까지의 정수를 다음과 같은 문자열로 나타낼 수 없습니다. 0000 ~ 9999. –

+0

네 제안이 맞고 @Chris Olsen의 제안도 맞습니다. 이것은 내 지식에 추가! –