簡體   English   中英

將IP地址從char *轉換為uin32_t

[英]Converting IP addresses from char * to uin32_t

我的靈感來自IP地址到整數的轉換

我的代碼如下所示:

    uint32_r parseIPV4string(char * ipAddress){
    char ipbytes[4];
    sscanf(ipAddress, "%uhh.%uhh.%uhh.%uhh", &ipbytes[3], &ipbytes[2], &ipbytes[1], &ipbytes[0]);
    return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24;
}

實際上,實際上是一個精確的副本,但是我的問題是我的IP地址無法正確顯示。 我震驚和敬畏地看着“ 129.173.118.0”和“ 129.173.31.187”都返回2164260864

有人可以解釋發生了什么嗎?

也許我使用的解析器不正確,我不確定它的工作原理,即“%uhh”。 對我來說是新手,我不知道該return語句中發生了什么。

您的sscanf失敗。 發生這種情況時,參數將處於不確定狀態。 因此,您的return語句返回垃圾。

%uhh表示讀入unsigned int ,然后將字母'h'匹配兩次。 如果您輸入的字符串實際上沒有在第一個數字之后包含h ,則匹配失敗,並且sscanf將返回1 (如果沒有第一個數字,則返回0 )。

您可能是說%hhu ,以讀取整數並存儲在unsigned char ,但是您還需要使ipbytesunsigned char以匹配格式說明符。 純字符或帶符號char的說明符為%hhd

這個數組應該是無符號的,無論如何,否則你| 稍后會搞砸(請記住,負數設置了很多1位,以2的補碼表示)。

進一步的問題是,如果您的系統中使用,即使有32位int,然后unsigned char ,所述表達ipbytes[3] << 24原因如果滿足高比特未定義行為ipbytes[3]符號整數溢出被設置時,由於:不幸的是, 整數提升將 unsigned char提升為一個有符號的int

最后,如果系統具有16位int,則<< 16<< 24完全失敗。

編寫該函數的一種可靠方法是避免出現任何不良提升:

uint32_t parseIPV4string(char const * ipAddress)
{
    unsigned int ip[4];

    if ( 4 != sscanf(ipAddress, "%u.%u.%u.%u", &ip[0], &ip[1], &ip[2], &ip[3]) )
         return 0;   // or some other indicator or error

    return ipbytes[3] + ipbytes[2] * 0x100 + ipbytes[1] * 0x10000ul + ipbytes[0] * 0x1000000ul;
}

如果您真的想使用| <<那么或者使用一些丑陋的鑄件; 或將ip更改為uint32_t類型,在這種情況下,必須將"%u"替換為"%" SCNu32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM