求一个比较实用的函数,调试写Log的函数

来源:互联网  时间:2016/8/31 13:10:34

关于网友提出的“ 求一个比较实用的函数,调试写Log的函数”问题疑问,本网通过在网上对“ 求一个比较实用的函数,调试写Log的函数”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 求一个比较实用的函数,调试写Log的函数
描述:

二进制,16进制,内存显示

求一个函数,已知道内存地址,内存大小  ,
 要求十六进制输出这段内存,
  并保存某个文本文件,
  格式如下所示  
尽量把识别内存中的中文,字符,标点符号等等,类是UltraEdit
 求一个比较实用的函数,调试写Log的函数
解决方案1:

引用 5 楼 zhao4zhong1 的回复:
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

突发奇想,百度了这句话,百度给出的前五条都是赵老师的。 求一个比较实用的函数,调试写Log的函数解决方案2:


//传入源地址,长度,输出目的地址
int ForMatBin(char* pDestBuf,char* pSrcBuf,int iSrcLen)
{
int iRet = SR_FAILED;
if (NULL == pDestBuf || NULL == pSrcBuf)
{
return iRet;
}
int nAddr  = 0;
int nLineCount  = 0;
int n  = 0;
int nBufferCount = iSrcLen;
char szLine[256] = {0}; 
if( 0 < iSrcLen)
{
while(1)
{
n = 0;
n += ForMatString(szLine + n,256 - n,"%p - ",pSrcBuf + nAddr);
nLineCount = 16;
if(nBufferCount < nLineCount) 
{
nLineCount = nBufferCount;
}
n += StringToHex(szLine + n,pSrcBuf + nAddr,nLineCount);
int iCount = 16 - nLineCount;
if (iCount != 0)
{
memset(&szLine[n],32,iCount*2);
}
n += StringToAsci(szLine + n + iCount*2,pSrcBuf + nAddr,nLineCount);
strcat(pDestBuf,szLine);
strcat(pDestBuf,"\n");
nAddr += 16;
nBufferCount -= 16;
if(0 >= nBufferCount) 
{
break;
}

}
return iRet;
}
int ForMatString(char* pDestBuf,int iMaxDestLen,char* pBuffer,...)
{
int iRet = SR_FAILED;
int iListCount = 0;
if (NULL == pDestBuf || NULL == pBuffer)
{
return iRet;
}
va_list pArgList;
va_start(pArgList,pBuffer);
iListCount += _vsnprintf(pDestBuf + iListCount,iMaxDestLen - iListCount,pBuffer,pArgList);
va_end(pArgList);
if(iListCount > (iMaxDestLen - 1)) 
{
iListCount = iMaxDestLen - 1;
}
*(pDestBuf + iListCount) = '\0';
iRet = iListCount;
return iRet;
}
int StringToHex(char* pDestBuf,char* pSrcBuf,int iSrcLen)
{
int iRet = SR_FAILED;
int i  = 0;
int j  = 0;
if (NULL == pDestBuf || NULL == pSrcBuf)
{
return iRet;
}
for(i = 0;i < iSrcLen; i++)
{
iRet += ForMatString(pDestBuf + iRet,256,"%02X ",(unsigned char)*(pSrcBuf + i));
j++;
if(4 == j)
{
j = 0;
iRet += ForMatString(pDestBuf + iRet,256," ");
}

if(16 > iSrcLen) 
{
for( ;i < 16;i++)
{
iRet += ForMatString(pDestBuf + iRet,256," ");
j++;
if(4 == j)
{
j = 0;
iRet += ForMatString(pDestBuf + iRet,256," ");
}
}

return iRet;
}
int StringToAsci(char* pDestBuf,char* pSrcBuf,int iSrcLen)
{
int iRet = SR_FAILED;
if (NULL == pDestBuf || NULL == pSrcBuf)
{
return iRet;
}
for(int i = 0; i < iSrcLen; i++) 
{
//ASCII 字符表中,可显示字符代码>32
if(32 <= *(pSrcBuf + i)) 
{
iRet += ForMatString( pDestBuf + iRet, 256, "%c", *(pSrcBuf + i));
}
else
{
iRet += ForMatString( pDestBuf + iRet, 256, ".");
}

return iRet;
}
解决方案3:

赵老师,你过分了。。。

解决方案4:

 求一个比较实用的函数,调试写Log的函数

解决方案5:

void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];
    for (i=0;i<>
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<>
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<>
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<>
            sprintf(binstr,"%s%c",binstr,('!'<>
        }
        printf("%s\n",binstr);
    }
}

上一篇求装64位win7系统的坛友帮助运行一个程序
下一篇调用call7z函数来使用7z来解压
明星图片
相关文章
《 求一个比较实用的函数,调试写Log的函数》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)