关于网友提出的“ 求一个比较实用的函数,调试写Log的函数”问题疑问,本网通过在网上对“ 求一个比较实用的函数,调试写Log的函数”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 求一个比较实用的函数,调试写Log的函数描述:
二进制,16进制,内存显示
求一个函数,已知道内存地址,内存大小 ,要求十六进制输出这段内存,
并保存某个文本文件,
格式如下所示
尽量把识别内存中的中文,字符,标点符号等等,类是UltraEdit

解决方案1:
突发奇想,百度了这句话,百度给出的前五条都是赵老师的。

解决方案3:
//传入源地址,长度,输出目的地址
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;
}
赵老师,你过分了。。。
解决方案4: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);
}
}