如果我有一個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,依此類推。
我該怎麼做?
如果我有一個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,依此類推。
我該怎麼做?
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]);
'%hhu'對於每個地址組件都是一個更好的說明符,因爲那正是你給'sprintf'的東西。 – dreamlax 2010-11-04 08:43:57
您的劇本錯誤。您需要在**解除引用指針之前將其轉換爲'unsigned char *'**,而不是之後。之後做的是具有實現定義的行爲,可能會引發信號或錯誤地轉換(在非二進制補碼系統上)。 – 2010-11-04 21:50:41
當然,最好使用正確的類型('unsigned char [4]'或'uint8_t [4]')來開始。 – 2010-11-04 21:52:29
一個IP地址ist只是單獨的八位字節打印爲由十進制分隔的十進制數。
printf("%d.%d.%d.%d",address[0],address[1],address[2],address[3]);
你或許應該讓你的char address[4]
的unsigned char address[4]
使用%u會甚至更好。
這給出了'堆棧粉碎檢測'錯誤,用gcc編譯。 – sje397 2010-11-04 09:43:03
%u只能用於未簽名的數據 - 該消息意味着sprintf緩衝區溢出,這可能意味着您的類型不同意。 – 0xDEADBEEF 2010-11-04 10:00:07
馬丁 - 不是我的類型,而是問題中使用的類型。 '%u'期望'unsigned int'值。 – sje397 2010-11-04 14:06:55
「將4字節的IP地址轉換爲字符數組」是一個錯誤的問題 - 它已經是一個「字符數組」了。你的意思是你想要在標準的點分十進制ip表示法中獲得文本表示。主題相應改變。 – 2010-11-04 21:49:15