我有四个CString 类型的变量,str1,str2,str3,str4
我想将这四个数做异或操作,该怎样操作呢?

解决方案 »

  1.   

    先用atoi转成整形再做异或操作即可
      

  2.   

    CString str5;
    uint n1,n2,n3,n4,n5;
    sscanf(str1,"%d",&n1);
    sscanf(str2,"%d",&n2);
    sscanf(str3,"%d",&n3);
    sscanf(str4,"%d",&n4);
    n5=n1^n2^n3^n4;
    str5.Format("%d",n5);
      

  3.   

    我觉得你得一位一位的取出来进行异或,
    用CString的GetAt来取出其中的一位,异或完了用SetAt放回
      

  4.   

    楼上的,试了,不行啊!jack,你说的是先转二进制?
      

  5.   

    CString str;
    //先转化成字符串
    char sz[]
    在转化成BYTE[]
    然后再转回"\xAB\xCD"->"ABCD"->0xAB、0xCD,
    然后逆序
      

  6.   

    回复zoedwin、oldforest:
    刚刚说的有些小错误,重新描述如下:
    CString抑或字符串有以下两种:
    1、16进制,"\xAB\xCD\x31"
    此种字符串直接memcpy到BYTE数组,相应的值即为0xAB、0xCD、0x31
    2、普通,"abcd31"
    此种字符串转化为BYTE数组可通过以下方法:
    int Char2Hex(char c)
    {
    if ('0'<=c && c<='9') 
    {
    return c-'0';
    }
    else if ('a'<=c && c<='f')
    {
    return c-'a'+10;
    }
    else if ('A'<=c && c<='F')
    {
    return c-'A'+10;
    }
    else
    {
    return -1;
    }
    }bool Str2Byte(BYTE *pData, const char *szMsg, int nMsgLen)
    {
    int hi, lo;
    for (int i=0; i<nMsgLen/2; i++)
    {
    hi=Char2Hex(szMsg[i*2]);
    lo=Char2Hex(szMsg[i*2+1]);
    if (hi<0 || lo<0)
    {
    return false;
    }
    pData[i]=(hi<<4)+lo;
    }
    return true;
    }调用Str2Byte即可另:To zoedwin:你的另一个帖子还是关了吧
      

  7.   

    上一楼的"另:To zoedwin:你的另一个帖子还是关了吧",是我看错了,抱歉
      

  8.   

    没关系,我想再问一下
    Str2Byte(BYTE *pData, const char *szMsg, int nMsgLen)
    这三个参数怎样传啊?
      

  9.   

    如果是16进制的话,这样:
    CString str5;
    uint n1,n2,n3,n4,n5;
    sscanf(str1,"%X",&n1);
    sscanf(str2,"%X",&n2);
    sscanf(str3,"%X",&n3);
    sscanf(str4,"%X",&n4);
    n5=n1^n2^n3^n4;
    str5.Format("%X",n5);
      

  10.   

    谢谢楼上的各位,还有一个小问题,例如我拿到了一个十六进制数:E7,我想先要个E,再取ASCII值,再取7的ASCII值,问题是我怎样把E7拆开呢??给方法也行!谢谢!
      

  11.   


    如:
    char szSrc[]="abcdef"
    则转为BYTE b[3]即可Str2Byte(b, szSrc, strlen(szSrc));
      

  12.   


    例如BYTE b=0xE7;
    int hi = b&0xF0, lo = b & 0x0F;
      

  13.   

    高四位 hi = (b&0xF0)>> 4;
      

  14.   

    BYTE btDest = 0xE7;
    BYTE btHigh = (btDest & 0xF0) >> 4;
    BYTE btLow = btDest & 0x0F;
      

  15.   

    这样取值后怎样取ASCII码值呢?
      

  16.   

    数字E的ascII码值就是字符'E'吧
      

  17.   

    刚刚发现了一个问题,
    BYTE btDest = 0xE7;
    BYTE btHigh = (btDest &amp; 0xF0) >> 4;
    BYTE btLow = btDest &amp; 0x0F;这个取值好像没有区分大小写啊!
      

  18.   

    取十六进制E7分别对应的ASCII码值,再把ASCII值转十六进制,我的最终问题就这样!
      

  19.   

    “再把ASCII值转十六进制”这个说法本身就是错误的,数字本身没有什么几进制,只有显示出来后才有几进制之说,你所谓的转十六进制,是要把它转换成字符显示出来吗?
      

  20.   

    所以请再帮一下忙,E7怎样拆开再取ASCII码值,谢谢啦!
      

  21.   

    UINT nDest = 0xE7;
    CString strHex;
    strHex.Format("%02X",nDest);
      

  22.   

    你这样只能取E7,取不到E的ascii码值和7的ascii码值啊!
      

  23.   

    UINT nDest = 0xE;
    CString strHex;
    strHex.Format("%1X",nDest);
      

  24.   

    虽然问题还没解决,但还是谢谢各位的帮忙,尤其是oldforest!谢谢!
      

  25.   

    UINT nDest = 0xE7;
    UINT nHigh = (nDest & 0xF0) >> 4;
    UINT nLow = nDest & 0x0F;
    char szStr1[2],szStr2[2];
    BYTE cAsc1,cAsc2;
    sprintf(szStr1,"%1X",nHigh);
    sprintf(szStr2,"%1X",nLow);
    sscanf(szStr1,"%c",&cAsc1);
    sscanf(szStr2,"%c",&cAsc2);