C++ IP到长转换c++;
我正在尝试在C++ IP到长转换c++;,c++,visual-studio,scanf,C++,Visual Studio,Scanf,我正在尝试在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, &a
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;
}
无符号长ipstringtolog(std::string IPAddr)
{
无符号字符aClassByte、bClassByte、cClassByte、dClassByte;
sscanf_s(IPAddr.c_str(),IP_TO_BYTES_格式,&aClassByte,&bClassByte,&cClassByte,&dClassByte);
无符号长IP=(ACLASBYBASE),你说你在使用C++,但是实际上你调用了一个C函数。这就是你的问题的原因:你找到了一点C99代码。<代码> %HU 是C99。你的VisualStudio版本不实现C99。
修复很简单,因为您需要修复更多。也不要使用short
;虚线四元格式允许8.24
和8.8.16
。换句话说,您需要%d.%d.%d
,并检查实际读取的字段数(返回scanf
的值)。虽然我们做得很好,但我们还是可以使用int部分[4]
而不是a、b、c、d
%hh
不是有效的格式。您的意思是%hu
吗?sscanf类函数对参数不是类型安全的。%u格式需要指向整数的指针,您给指向字符(字节)的指针,sscanf函数不知道这一点。下一个变量被销毁(运行时的调试版本发出警告)@一些编程人员,是的,谢谢!@JacekCz仍然不明白为什么它可以很好地工作short@JacekCz:是的,但即使这样,您仍然需要正确的scanf
说明符。它不仅是大小,还包括陷阱位。非常感谢!我不完全理解您关于虚线四元格式允许8.24等的说明。您能给我指一下吗我正在阅读?@OferArial:参见维基百科。基本上,10.1234567
是10.x.x
范围内的有效地址。要将其转换为长地址,请计算(10@OferArial:IPv4地址可以用四种不同格式中的一种表示:a.b.c.d
、a.b.c
、a.b
和a
。每个数字本身可以用十进制(最常见)、十六进制或八进制格式表示。其他类似的函数可以为您处理所有这些格式。请阅读inet\u addr()
documentation可以很好地总结这些格式所代表的内容。您显示的代码只支持十进制格式的a.b.c.d
,这是最常用的格式,但肯定不是唯一可用的格式。