我们现在得到是蓝牙地址的一个字符串,
比如:CString str_btAddr = "0080376905f1";
       BT_ADDR bt_addr; (BT_ADDR 是ULONGLONG 类型的)
      ................
      要的结果是:bt_addr = 0x0080376905f1
请问有什么函数可以实现啊?有一个笨的方法那就是字符串一个个取出来,乘于16转换,再相加,但那样太麻烦了。请教各位有什么简单的方法吗?

解决方案 »

  1.   

    x86没有他都是对应ULONG的也就是32为整数,不能转换成ULONGLONG。必须自己写
      

  2.   

    给个思路:
    1 = '1' - '0';另,boost里边有个专门的cast模版,但是不知到能不能处理ULONGLONG
      

  3.   

    char szAddr[]="0080376905f1";
    char *pCursor=szAddr;bt_addr=*pCursor++;
    char ch;
    while(ch=*pCursor)
    {
      bt_addr<<=4;
      bt_addr|=ch;
      pCursor++;
    }
      

  4.   

    to:谢谢楼上三位
    to:chehw(chehw) 我试了一下你的那段,
    出来的 bt_addr = 901269753116529
    感觉跟这个0080376905f1没有什么关系。
      

  5.   

    各位,
    ULONGLONG a;
    CString str_btAddr = L"008037690511";
    swscanf((LPCTSTR)str_btAddr, L"%I64d", &a);    
    BT_ADDR bd_addr = a;
             出来a = 8037690511;
     
    如果CString str_btAddr = L"008037690f11";
              出来a = 8037690;
    我想应该是"%I64d的问题。 
      

  6.   

    char szAddr[]="0080376905f1";
    char *pCursor=szAddr;char ch;
    ch=*pCursor++;
    if(ch>='0' && ch<='9')
    {
    ch-=0x30;
    }else
    {
    ch&=~0x20;
    ch-=0x41;
    ch+=10;
    }
    bt_addr=ch;while(ch=*pCursor)
    {
      bt_addr<<=4;
      if(ch>='0' && ch<='9')
    {
    ch-=0x30;
    }else
    {
    ch&=~0x20;
    ch-=0x41;
    ch+=10;
    }
      bt_addr|=ch;
      pCursor++;
    }
      

  7.   

    to:chehw(chehw) 非常感谢你提供的算法。
    我刚刚也在写了点没完整,看来算法才是最重要的,是程序员的灵魂,以后多像你学习。还问一下,你上边这代码是得到10进制的数,我把它转成16进制的数,
    bt_addr = 80376905f1;
    但我怎么样才能在前边在添两个0,和0x,使它是:bt_addr = 0x80376905f1;
    因为蓝牙地址是严格按照这样来的。
      

  8.   

    对于ULONGLONG,不需要加0。(前面已经是0)当需要输出成字符串型时才需要。
      

  9.   

    再次感谢chehw(chehw)
    用以下的代码也是可以实现的.
             ULONGLONG a;
    BT_ADDR bd_addr;
    CString str_btAddr = L"0080376905f1";
    swscanf((LPCTSTR)str_btAddr, L"%I64x", &a);
    结帖了.