//下面的代码先从IP控件内取数据,并将其存入m_BEndAddress和m_BBeginAddress内。
BYTE m_BEndAddress[4];
BYTE m_BBeginAddress[4]; UpdateData();
unsigned int b,e,i;
CIPAddressCtrl * ctrl=(CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS_BEGIN);
BYTE a[4]; ctrl->GetAddress(a[0],a[1],a[2],a[3]);
for(i=0;i<4;i++)
m_BBeginAddress[i]=a[i];
ctrl=(CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS_END);
ctrl->GetAddress(a[0],a[1],a[2],a[3]);
for(i=0;i<4;i++)
m_BEndAddress[i]=a[i];/////////////////////////下面的是什么意思?24、16、8都表示什么,移位操作有什么作用?
b=(m_BBeginAddress[0]<<24)+(m_BBeginAddress[1]<<16)+
(m_BBeginAddress[2]<<8)+m_BBeginAddress[3];
e=(m_BEndAddress[0]<<24)+(m_BEndAddress[1]<<16)+
(m_BEndAddress[2]<<8)+ m_BEndAddress[3];
/////////////////////还有下面的,这一句,我也不明白,255是什么意思?16又是什么?为什么左移、右移?
                  BYTE w=a;
TRACE("%d --%d\n",w&(255<<16),(w&(255<<16))>>16);

解决方案 »

  1.   

    移位操作把IP地址存放入一个整数,该整数每8位存储一个IP地址的一个8位位组。
      

  2.   

    其实,MFC中GetAddress提供了这样的重载:int GetAddress( DWORD& dwAddress );
    可以
    DWORD b,e;
    CIPAddressCtrl * ctrl=(CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS_BEGIN);
    ctrl->GetAddress(b);
    ctrl=(CIPAddressCtrl *)GetDlgItem(IDC_IPADDRESS_END);
    ctrl->GetAddress(e);
      

  3.   

    恩,非常感谢上面两位的发言。灰尘的做法很简单。
    但我只是想借些问题,了解一点位移操作,下面的这一句是什么意思?
    m_BBeginSegAddress[0]=(w&(255<<24))>>24;尤其是后面的位移操作,目的是什么呀?能否给我讲讲?谢谢。。
      

  4.   

    我认为BYTE w=a;是错误的,
    应该是 DWORD w = b;
    这个整数每8位存储一个IP地址的一个8位位组,如0x12345678,表示IP地址 0x12.0x34.0x56.0x78
    而255<<24,即为0xFF000000,它和w进行与操作,结果就是这个整数w保留了最高8位值,其它置0,即
    0x12000000
    然后右移24位,变成0x12,表示IP地址的第一个8位位组,然后赋值给m_BBeginSegAddress[0]。