2010-11-22 110 views
0

HI,如何在MFC(VC++)中对CString值进行按位与(&)操作?

如何在MFC(VC++)CString值上按位与(&)? 例如:

CString NASServerIP = "172.24.15.25"; 
CString SystemIP = " 142.25.24.85"; 
CString strSubnetMask = "255.255.255.0"; 

int result1 = NASServerIP & strSubnetMask; 
int result2 = SystemIP & strSubnetMask; 

if(result1==result2) 
{ 
    cout << "Both in Same network"; 
} 
else 
{ 
    cout << "not in same network"; 
} 

我怎么可以按位与CString值? 它给出的错误为''CString'没有定义这个运算符或转换为预定义运算符可接受的类型“

回答

5

您不需要。在两个字符串上逐位进行并行处理并没有多大意义。您需要获取IP地址字符串的二进制表示,然后您可以对它们执行任何按位操作。这可以通过首先obtaining a const char* from a CString然后将其传递给the inet_addr() function来容易地完成。

基于您的代码片段的一个(简单)示例。

CString NASServerIP = "172.24.15.25"; 
CString SystemIP = " 142.25.24.85"; 
CString strSubnetMask = "255.255.255.0"; 

// CStrings can be casted into LPCSTRs (assuming the CStrings are not Unicode) 
unsigned long NASServerIPBin = inet_addr((LPCSTR)NASServerIP); 
unsigned long SystemIPBin = inet_addr((LPCSTR)SystemIP); 
unsigned long strSubnetMaskBin = inet_addr((LPCSTR)strSubnetMask); 

// Now, do whatever is needed on the unsigned longs. 
int result1 = NASServerIPBin & strSubnetMaskBin; 
int result2 = SystemIPBin & strSubnetMaskBin; 

if(result1==result2) 
{ 
    cout << "Both in Same network"; 
} 
else 
{ 
    cout << "Not in same network"; 
} 

unsigned longs的字节在从字符串表示“反向”。例如,如果你的IP地址字符串是192.168.1.1,从inet_addr生成的二进制文件将0x0101a8c0,其中:

  • 0x01 = 1
  • 0x01 = 1
  • 0xa8 = 168
  • 0xc0 = 192

但是,这不应该影响您的按位操作。

当然您需要包括在Winsock头(#include <windows.h>通常是足够的,因为它包含winsock.h)和对WinSock库链接(wsock32.lib如果你包括winsock.h)。

+0

@In silico:请提供一些示例。 – 2010-11-22 09:44:20

+0

@Swapnil Gupta:根据'inet_addr()'文档和我链接的堆栈溢出问题/答案应该很容易找出结论。但是,我已经添加了几行。 – 2010-11-22 09:57:45

+0

@In silico:使用这种方法,我可以找出两个IP地址是否在同一个网络中? – 2010-11-22 10:09:10