读书人

比较实用的函数调试写Log的函数

发布时间: 2013-12-04 17:21:01 作者: rapoo

求一个比较实用的函数,调试写Log的函数
求一个函数,已知道内存地址,内存大小 ,
要求十六进制输出这段内存,

并保存某个文本文件,
格式如下所示

尽量把识别内存中的中文,字符,标点符号等等,类是UltraEdit



比较实用的函数,调试写Log的函数 二进制,16进制,内存显示
[解决办法]


//传入源地址,长度,输出目的地址
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;
}



[解决办法]
void HexDump(char *buf,int len) {
int i,j,k;
char binstr[80];


for (i=0;i<len;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,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
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<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}


[解决办法]

[解决办法]
比较实用的函数,调试写Log的函数
[解决办法]
赵老师,你过分了。。。

读书人网 >C++

热点推荐