比如有一串字符串s: aa 02 00 55
用十六进制显示是 61 61 20 30 32 20 30 30 35 35
我想实现的是如何把字符串s转换为另一字符串ss,然后ss的十六进制显示是aa 02 00 55
求s转换为ss的算法

解决方案 »

  1.   

    0 ~ 9 的 减去0x30 内存里面就是 就由 20 30 32 20 30 30 35 35 变成 02 00 55字符在a~f  减0x61 + 0xA 就行了
    或A ~ F 之间的  减'A'的16进制(忘了是多少..) + 0xA 就行了.....你对每个字符判断转换一次就行了
      

  2.   

    简单写一个,能够达到效果:
    CString s = "aa020055";
    int nSize = s.GetLength();
    char *pS = s.GetBuffer(nSize);
    CString ss;
    for(int i=0; i<nSize-1; i+=2)
    {
    char ch[2];
    ch[0] = *(pS+i);
    ch[1] = *(pS+i+1);
    BYTE byVal = strtol(ch,NULL,16);
    ss += byVal;
    }
            s.ReleaseBuffer();
      

  3.   

    大写的'A' ascii 0x41   大写比小少0x20
      

  4.   

    遍历字符串
    把每个字符变成相应的ascall值
      

  5.   

    如果你是MFC工程
    可以用AfxExtractSubString 以空格为分隔提取子字符串
      

  6.   

    你的aa020055转换为十六进制以后编程A8280858了
      

  7.   

    不可能啊。我都调试过了。看ss的内存数据实是 AA020055啊。
      

  8.   

    重复一下你的需求:
    已有字符串CString s = "aa020055"
    要求转换成 0xaa020055
      

  9.   

    CString strMsg;
    GetDlgItemText(IDC_SEND_DATA, strMsg);
    int nSize = strMsg.GetLength();
    char *pS = strMsg.GetBuffer(nSize);
    CString ss;
    for(int i=0; i<nSize-1; i++)
    {
    char ch[2];
    ch[0] = *(pS+i);
    ch[1] = *(pS+i+1);
    BYTE byVal = strtol(ch,NULL,16);
    ss += byVal;
    }
            strMsg.ReleaseBuffer();
    int iSend = send(m_ConnectSock, (char *)ss.GetBuffer(0), ss.GetLength(), 0);
    ss.ReleaseBuffer();
    我用这个代码,接受方十六进制显示是A8280858
      

  10.   

    接收方显示的问题 ,你在
    int iSend = send(m_ConnectSock, (char *)ss.GetBuffer(0), ss.GetLength(), 0);
    下断点,看看ss的内存是否正确.正确的话就是接受方的问题
      

  11.   

    for(int i=0; i<nSize-1; i++)
    看清楚,
    for(int i=0; i<nSize-1; i+=2)
      

  12.   

    程序代码如下:
    int nSize = strMsg.GetLength();
    char *pS = strMsg.GetBuffer(nSize);
    CString ss;
    for(int i=0; i<nSize-1; i=i+2)
    {
    char ch[2];
    ch[0] = *(pS+i);
    ch[1] = *(pS+i+1);
    BYTE byVal = strtol(ch,NULL,16);
    ss += byVal;
    }
            strMsg.ReleaseBuffer();
    int iSend = send(m_ConnectSock, (char *)ss.GetBuffer(0), ss.GetLength(), 0);
    ss.ReleaseBuffer();
      

  13.   

    不是抄错,是我再上面修改了,不过结果还是错误
    aa发送到对方显示还是A8,对方是标准的程序,应该也不会错。提示我看到byVal的值也是对的
      

  14.   

    如果直接发送字符aa,对方显示十六进制6161也是正确的
    用你的程序,ss应该就是十六进制,输入aa,对方显示的却是A8
    很奇怪
      

  15.   

    那你直接发送0xAA呢,对方显示多少??????????
      

  16.   

    写错了,发送0xaa,显示08 A8
      

  17.   

    不说了。也不清楚你这程序想干什么。猜谜语也没有意思。你自己都没有搞清楚数据的正确输入输出应该是啥样的。0xAA是一个字符,居然显示08 A8,而发送字符串aa,居然也是显示 6161。啥玩意嘛
      

  18.   

    如果直接发送字符串,比如abcd,对方显示十六进制是61626364是正常的,
    用你的算法发送字符串,输入abcd,显示是B8 D8
    目前代码如下:
    CString strMsg;
    GetDlgItemText(IDC_SEND_DATA, strMsg);
    int nSize = strMsg.GetLength();
    char *pS = strMsg.GetBuffer(nSize);
    CString ss;
    for(int i=0; i<nSize-1; i=i+2)
    {
    char ch[2];
    ch[0] = *(pS+i);
    ch[1] = *(pS+i+1);
    BYTE byVal = strtol(ch,NULL,16);
    ss += byVal;
    }
            strMsg.ReleaseBuffer();
    int iSend = send(m_ConnectSock, (char *)ss.GetBuffer(0), ss.GetLength(), 0);
    ss.ReleaseBuffer();
      

  19.   

    就是想在客户端输入比如aa020055,服务器端收到的字符串的十六进制是aa020055
      

  20.   

    那你现在已经测试了,发送前ss的十六进制已经是aa020055了, 再不正确,要么只能是你的理解有问题。
      

  21.   

    解决了
    把BYTE byVal = strtol(ch,NULL,16);
    修改为int byVal = strtol(ch,NULL,16);
    结果就对了,谢谢happyparrot
      

  22.   

    楼主的问题着实有点"dan 疼":
    1.如果原始字符串除掉空格之后有奇数个字符的话....(第一次程序里没考虑空格,后来补上了)
    2.如果原始字符中出现非十六进制字符的话....比如ST什么的,最后的字符串十六进制显示无论如何也得不到的
    胡乱扫了几眼上面的帖子,居然忽略了最后楼主说问题解决的回复...悲剧,白白劳碌了...
    下面是我自己写的程序,在VS2008下测试通过.发出来大家交流一下而已,毕竟浪费了一点脑细胞的说..
    (写好就发出来了,完全没有优化,至于效率什么的大家就不要打击我了)
    ps:本人目前还不会如何引用代码,求热心人指点一二.#include <stdio.h>
    #include <string.h>
    #include <ctype.h>int Func(const char *source, char *result);int main()
    {
        char testStr[] = "aa 02 00 55";
        char resultStr[10];
        Func(testStr, resultStr);
        return 0;
    }int Func(const char *source, char *result)
    {
        int length = strlen(source);
        if((length + 1) % 3 != 0) //确保除掉空格之外还有偶数个字符
    return -1;
        int j = (length + 1) / 3;
        for(int i=0; i<j; i++)
        {
    char c1 = toupper(source[3 * i]);
    char c2 = toupper(source[3 * i + 1]);
    if(!(isxdigit(c1) && isxdigit(c2)))  //确保没有非十六进制的字符
        return -1;
    result[i] = (isdigit(c1) ? (c1 - '0') : (c1 - 'A' + 10)) * 16
    + (isdigit(c2) ? (c2 - '0') : (c2 - 'A' + 10));
        }
        result[j] = '\0';
        return 0;
    }说明:
    1.上面帖子很多,没有细看,
      

  23.   

    最后那个说明是我没有编辑掉的,大家忽略即可...对于CSDN,我是完全新手的说...基本功能都不会用...