我有个很棘手的问题
新手不懂
请教各位大虾帮忙我现在有个字符串0891683108200805F0240D91683196435852F4000080209290348323024132
有个函数能把我的字符串分析出来
其中有个取高低四位的函数
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
int gsmString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
for(int i=0; i<nSrcLength; i+=2)
{
// 输出高4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst = (*pSrc - '0') << 4;
}
else
{
*pDst = (*pSrc - 'A' + 10) << 4;
} pSrc++;

// 输出低4位
if(*pSrc>='0' && *pSrc<='9')
{
*pDst |= *pSrc - '0';
}
else
{
*pDst |= *pSrc - 'A' + 10;
} pSrc++;
pDst++;
} // 返回目标数据长度
return nSrcLength / 2;
}
在处理这个字符串的第一步的时候
就会调用到这个函数
取出08
但是我debug的时候总觉得不对劲
出来的结果不对
关于高低位这些位运算我不熟
帮忙一下谢谢各位了

解决方案 »

  1.   

    0891683108200805F0240D91683196435852F4000080209290348323024132 这是短信啊int
    parse( char *strtext, unsigned char *binbuf )
    {
    size_t l = strlen( strtext );
    int thelen = 0;
    size_t i;
    unsigned char a;
    unsigned short t; for( i = 0; i < l; i++ )
    {
    if( '/' == strtext[ i ] )
    {
    do
    {
    strtext[ i ] = ' ';
    i++;
    } while( 0x0a != strtext[ i ] && 0x0d != strtext[ i ] && 0x00 != strtext[ i ] );
    }
    } for( i = 0; i < l; i++ )
    {
    if( ( strtext[ i ] >= '0' && strtext[ i ] <= '9' ) ||
    ( strtext[ i ] >= 'A' && strtext[ i ] <= 'F' ) ||
    ( strtext[ i ] >= 'a' && strtext[ i ] <= 'f' ) )
    {
    if( strtext[ i ] >= '0' && strtext[ i ] <= '9' )
    a = strtext[ i ] - '0';
    if( strtext[ i ] >= 'A' && strtext[ i ] <= 'F' )
    a = strtext[ i ] - 'A' + 10;
    if( strtext[ i ] >= 'a' && strtext[ i ] <= 'f' )
    a = strtext[ i ] - 'a' + 10; thelen++; if( thelen % 2 ) //如果是第奇数个1,3,5
    {
    t = a;
    }
    else
    {
    t <<= 4;
    t += a;
    *( binbuf + ( thelen / 2 ) - 1 ) = ( unsigned char )t;
    }
    }
    }
    return thelen / 2;
    }这正好是你需要的。
      

  2.   

    return (thelen + 1) / 2; ?
      

  3.   


    俺也写过, 数据多查表很快
    static BYTE Hex2Table[256] =
    {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
    };
    DWORD NData::HexToData(CHAR * pHexString, VOID * pMem, DWORD dwMemSize)
    {
    DWORD i, j;
    BYTE * pByte;
    BYTE bByteHi, bByteLo; pByte = (BYTE *)pMem;
    for(i=0, j=0; i<dwMemSize; j++)
    {
    bByteHi = pHexString[j];
    if(bByteHi == 0)
    break; bByteHi = Hex2Table[bByteHi];
    if(bByteHi > 0x0F)
    continue; j++; bByteLo = pHexString[j];
    if(bByteLo == 0)
    break; bByteLo = Hex2Table[bByteLo];
    if(bByteLo > 0x0F)
    continue; pByte[i] = bByteHi << 4 | bByteLo;
    i ++;
    } return i;
    }