2010-11-04 11 views
3

如果我有一個4字節地址存儲在字符地址[4]和內容是:轉換一個4字節的IP地址的標準點分十進制格式

address[0] = '\x80'; 
address[1] = '\xAB'; 
address[2] = '\x0A'; 
address[3] = '\x1C'; 

// all together: 80 AB 0A 1C 

我想將其轉換爲字符數組看起來像「128.171.10.28」,因爲十六進制中的80是128,十六進制中的AB是171,依此類推。

我該怎麼做?

+0

「將4字節的IP地址轉換爲字符數組」是一個錯誤的問題 - 它已經是一個「字符數組」了。你的意思是你想要在標準的點分十進制ip表示法中獲得文本表示。主題相應改變。 – 2010-11-04 21:49:15

回答

9
char saddr[16]; 
sprintf(saddr, "%d.%d.%d.%d", (unsigned char)address[0], (unsigned char)address[1], (unsigned char)address[2], (unsigned char)address[3]); 

char saddr[16]; 
unsigned char *addr = (unsigned char*)address; 

sprintf(saddr, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); 

,或者由dreamlax指出:

char saddr[16]; 
sprintf(saddr, "%hhu.%hhu.%hhu.%hhu", address[0], address[1], address[2], address[3]); 
+0

'%hhu'對於每個地址組件都是一個更好的說明符,因爲那正是你給'sprintf'的東西。 – dreamlax 2010-11-04 08:43:57

+0

您的劇本錯誤。您需要在**解除引用指針之前將其轉換爲'unsigned char *'**,而不是之後。之後做的是具有實現定義的行爲,可能會引發信號或錯誤地轉換(在非二進制補碼系統上)。 – 2010-11-04 21:50:41

+0

當然,最好使用正確的類型('unsigned char [4]'或'uint8_t [4]')來開始。 – 2010-11-04 21:52:29

5

一個IP地址ist只是單獨的八位字節打印爲由十進制分隔的十進制數。

printf("%d.%d.%d.%d",address[0],address[1],address[2],address[3]); 

你或許應該讓你的char address[4]unsigned char address[4]

+0

雖然我不需要打印出來。我需要將整個地址存儲在另一個包含字符{1,2,8,。,1,7,1,。,1,0,。,2,8}的字符數組中。 – MBU 2010-11-04 08:03:24

+0

這給出了「-128」對於第一個字符,除非按照建議將數組類型更改爲'unsigned char'。 – sje397 2010-11-04 08:07:26

+0

@MikeU:查找將字符串打印到變量中的函數。此外,字符串是char數組 – 2010-11-04 08:10:57

-1

使用%u會甚至更好。

+0

這給出了'堆棧粉碎檢測'錯誤,用gcc編譯。 – sje397 2010-11-04 09:43:03

+0

%u只能用於未簽名的數據 - 該消息意味着sprintf緩衝區溢出,這可能意味着您的類型不同意。 – 0xDEADBEEF 2010-11-04 10:00:07

+0

馬丁 - 不是我的類型,而是問題中使用的類型。 '%u'期望'unsigned int'值。 – sje397 2010-11-04 14:06:55

相關問題