2013-10-20 89 views
0

我有下面的代碼,其中我試圖創建一個長度爲7個字節的緩衝區,然後在網絡字節順序中將一個整數與char數組一起放入緩衝區,我不應該在我的sprintf()緩衝區末尾有空字符,所以我使用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

你不需要sprintf的,不僅僅是數據直接複製。

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

你應該使用類似:

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

是的我剛剛使用len = 13和緩衝區內容是相同的。好的,有沒有另一種方法,我可以將我的int轉換爲網絡字節順序,同時保留4字節的大小? –

+0

@ZahaibAkhtar如果你不想獲得可打印的字符串,那麼'memcpy()'應該可以正常工作。如果您需要獲取可打印的字符串或出於某種原因將自己限制爲十進制數字,那麼通過計數參數不可能表示範圍從-2^31到2^31-1的整數,範圍從0000到9999. –

+0

是的,你的建議是正確的,@Chris Olsen的建議也是如此。這增加了我的知識! –