2017-08-31 38 views
0

我想將IP字符串轉換爲長c++, 我寧願不使用任何inet的函數。IP到長轉換C++

我用下面的函數將其轉換:

unsigned long IPStringToLong(std::string IPAddr) 
{ 
     unsigned char aClassByte, bClassByte, cClassByte, dClassByte; 
     sscanf_s(IPAddr.c_str(), IP_TO_BYTES_FORMAT, &aClassByte, &bClassByte, &cClassByte, &dClassByte); 
     unsigned long IP = (aClassByte << 24) | (bClassByte << 16) | (cClassByte << 8) | dClassByte; 
     std::cout << IP << std::endl; 
     return IP; 
} 

IP_TO_BYTES_FORMAT這裏定義:

#define IP_TO_BYTES_FORMAT "%hhu.%hhu.%hhu.%hhu"

印刷只是爲了調試。

Visual Studio引發運行時錯誤:Stack corruption around variable bClassByte,但轉換確實有效。

當我定義的格式short S(和改變路線的代碼):

#define IP_TO_BYTES_FORMAT "%hu.%hu.%hu.%hu"

它工作得很好,我不明白爲什麼。

+0

'「%hh」'不是有效的格式。你的意思是「%胡」嗎? –

+0

sscanf類函數不帶類型安全參數。 %u格式需要指向整數的指針,你給char(byte)指針,sscanf函數doest知道這一點。下一個變量被破壞(運行時的調試版本發出警告) –

+0

@Someprogrammerdude是的,謝謝! –

回答

1

你說你正在使用C++,但你實際上正在調用一個C函數。這是你的問題的原因:你已經找到了一些C99代碼。 %hhu是C99。您的Visual Studio版本不實現C99。

修復很容易,因爲無論如何您需要修復更多。不要使用short;點劃格式允許8.248.8.16。換句話說,您需要%d.%d.%d.%d,並檢查您實際讀取的字段數量(返回值爲scanf)。雖然我們做得對,但我們不妨使用int parts[4]而不是a,b,c,d

+0

非常感謝!沒有完全理解你的關於虛線四格式的註釋允許8.24等等。你能指點我讀些什麼嗎? –

+0

@OferArial:查看維基百科。基本上,'10.1234567'是'10.x.x'範圍內的有效地址。要將其轉換爲長整型,可以計算'(10 << 24)+ 1234567'。你不能在短時間內適應'1234567'。 – MSalters

+0

@OferArial:IPv4地址可以用4種不同格式之一表示:a.b.c.d,a.b.c,a.b和a。並且每個單獨的數字本身可以用十進制(最常見),十六進制或八進制格式表示。 ['inet_addr()'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms738563.aspx)和其他類似的函數爲您處理所有這些格式。請閱讀'inet_addr()'文檔以獲取這些格式所代表的內容。您顯示的代碼僅支持十進制格式的「a.b.c.d',這是最常用的格式,但絕對不是唯一可用的格式。 –