我正在尝试在c++
中将IP字符串转换为long,
而且我不想使用任何inet
功能。
我正在使用以下功能对其进行转换:
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
时(并更改代码):#define IP_TO_BYTES_FORMAT "%hu.%hu.%hu.%hu"
它工作正常,我不明白为什么。
最佳答案
您说您正在使用C ++,但实际上是在调用C函数。这就是造成问题的原因:您发现了一些C99代码。 %hhu
是C99。您的Visual Studio版本未实现C99。
修复很容易,因为您仍然需要进行更多修复。也不要使用short
。点分四进制格式也允许8.24
和8.8.16
。换句话说,您需要%d.%d.%d.%d
,并检查您实际读取了多少字段(scanf
的返回值)。而且,当我们做对时,我们最好使用int parts[4]
代替a,b,c,d
关于c++ - IP到长转换C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45983333/