C++ 16进制日志输出 每行右侧ASII输出

头文件

void logbuffer(unsigned char *buff, int len, int iclm = 16);

cpp文件

void logbuffer(unsigned char *buff,int len,int iclm )
{
    static const int clm = iclm; //每行被打印成16进制的字符数   只修改这一行就可以改变每行打印的字符数量

    static const int linelen = clm * 3 + clm + 1;//每行的字符总数
    char *Xbuffer = new char[(len/clm+1)*linelen];
    memset(Xbuffer,0, (len / clm + 1)*linelen);
    sprintf(Xbuffer, "\r\n");

    int linenum = 0;
    for (size_t i = 0; i < len; i++)
    {
        if (0 == (i+1)%clm )
        {
            sprintf(Xbuffer + 3 * i+ 1 + linenum * (clm+1)  , "%02X ", *(buff + i));
            for (size_t j = 0; j < clm; j++)
            {
                if ( isgraph(*(buff + i - clm+1 + j)) /*|| ispunct(*(buff + i - 15 + i))*/ )
                {
                    *(Xbuffer + 3 * i + 1 + linenum * (clm + 1) + j+3) = *(buff + i - clm+1 + j);
                }
                else
                {
                    *(Xbuffer + 3 * i + 1 + linenum * (clm + 1) + j+3) = ‘.‘;
                }
            }
            linenum++;
            *(Xbuffer + 3 * i + 1 + (clm + 1)*linenum+3-1) = ‘\n‘;

        }
        else {
            sprintf(Xbuffer + 3 * i+1+linenum* (clm + 1), "%02X ", *(buff + i));
        }
    }
    //最后一行处理
    if (0 != len % clm ) {
        for (size_t i = len % clm; i < clm; i++)
        {
            sprintf(Xbuffer + 1 + linenum * linelen+3*(i), "   ");
        }
        for (size_t i = 0; i < len % clm; i++)
        {
            if ( isgraph(*(buff + clm * linenum + i))/*|| ispunct(*(buff + 16 * linenum + i))*/ )
            {
                *(Xbuffer + 1 + linenum * linelen + clm * 3 + i) = *(buff + clm * linenum + i);
            }
            else
            {
                *(Xbuffer + 1 + linenum * linelen + clm * 3 + i) = ‘.‘;

            }
        }
    }
    //LOG(DEBUG) <<Xbuffer;
    delete[]Xbuffer;
}

//原创。转载请标明引用:https://www.cnblogs.com/liuguoyao514257665/p/9863837.html


原创。转载请标明引用:https://www.cnblogs.com/liuguoyao514257665/p/9863837.html

原文地址:https://www.cnblogs.com/liuguoyao514257665/p/9863837.html

时间: 2024-10-10 11:06:22

C++ 16进制日志输出 每行右侧ASII输出的相关文章

以16进制打印出一块内存buff

如下代码(支持windows与Linux)会以[16进制][每行16字节]打印出一块内存的内容: void PrintBuffer(void* pBuff, unsigned int nLen) { if (NULL == pBuff || 0 == nLen) { return; } const int nBytePerLine = 16; unsigned char* p = (unsigned char*)pBuff; char szHex[3*nBytePerLine+1] = {0};

支持windows linux下将指定内存段转为16进制与ascii码的日志输出类

来源:http://blog.csdn.net/lezhiyong 1. 简介 将指定内存段转为16进制与asci码的输出到日志文件的类. 2. 功能介绍 1) 支持window与linus双系统. 2) 可指定输出目录. 3) 日志能输出的时间精确到毫秒,日志能输出线程号. 4) 提供字符串输出. 5) 提供指定内存转换为16进制输出. 6) 提供指定内存转换为16进制和ascii码同时输出. 7) 可调整16进制输出间距. 3. 原理和算法 1) 模块是基于C++语言编写: 2) 通过条件定

vc 文字转换到机内码,输入汉字和数字, 输出一串16进制码(数字-〉ASII码,汉字—〉国标码)

// 可以用,此程序实现的是是文字转换到机内码.机内码=国标码+8080H,不过学习了. //此程序是利用汉字在机器内输出就是机内码的原理,直接保存的,其实挺简单. //输入一串汉字和数字的混合字符, 经过程序转换, 对应输出一串16进制码(数字-〉ASII码,汉字—〉国标码) CString temp; GetDlgItemText(IDC_EDIT1,m_hanzi);//将汉字保存到变量m_hanzi unsigned char *b=new unsigned char[m_hanzi.G

0x%02x 字符型的16进制输出

问题:将一个字符类型按16进制输出,输出格式为0xab, 0x后面要求是2位,不够2位则补0,比如“0x0b”. 常见的错误做法是: #include <stdio.h> int main() { char a = 0x41; // a = 'A' printf( "the hex value of a is 0x%02x\n", a ); return 0; } 如果a = 0xf1,上面的输出将是 0xfffffff1 而不是 0xf1. 究其原因,%x 是 unsig

从文件读入16进制数转化为10进制数再输出到文件中

sSN LMDscandata 1 1 B98C27 0 0 85C0 85C3 F55D73C5 F55DCC81 0 0 7 0 0 1388 168 0 1 DIST1 3F800000 00000000 DBBA0 1388 B5 136C 1373 136B 1389 1398 1356 136D 1386 137B 139C 13C4 13F7 1531 174D 1751 1755 1765 176C 1777 177B 1784 1791 1796 17A8 17C0 17C6

16进制,2进制,输出数的二进制表示

itoa转换为2进制的char*字符串,输出,cout<<hex<<128输出16进制 https://www.zhihu.com/question/20329210  8为无符号的范围是-128--127,00--7f表示0到127,80--FF表示-128到-1 char ss[33];  -1的补码16进制表示为0xffffffff,共需要32位,且高位不是0,所以需要33个字节来存:如果是-128呢?输出ffffff80,也需要33个字节:如果是128,只输出1000000

16进制的简单运算

描述现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果. 输入 第一行输入一个正整数T(0<T<100000)接下来有T行,每行输入一个字符串s(长度小于15)字符串中有两个数和一个加号或者一个减号,且表达式合法并且所有运算的数都小于31位 输出 每个表达式输出占一行,输出表达式8进制的结果. 样例输入 3 29+4823 18be+6784 4ae1-3d6c 样例输出44114 100102 6565分析:可以看出来这是一个考察C语言基础的体型,静下心来应该不会有问题,做出

jstack:将Process Explorer中看到的进程ID做16进制转换,到ThreadDump中加上0x 前缀即能找到对应线程(转)

原文链接:http://www.iteye.com/topic/1133941 症状: 使用Eclipse win 64位版本,indigo及kepler都重现了,使用tomcat 6.0.39,jdk1.6.u45及1.7u45均尝试了,也重现. 重现步骤很简单,使用debug模式启动时较容易出来,debug启动tomcat,(我的是webapp)然后在页面上随便点点即发现eclipse僵死,且任何从浏览器发出的请求都卡住不能被接收执行. 1.然后从任务管理器直接杀掉eclipse对应的jav

前端笔试题:拍扁多维数组、提取URL中的参数变成对象、实现string的trim()函数、判断Email地址、16进制颜色转rgb格式

(1)拍扁数组 这是一个著名互联网公司今天的前端笔试题:多维数组维数不定,如[2,4,1,[2,3,4,[1,2],5,3],3,8]拍扁为[2,4,1,2,3,4,1,2,5,3,3,8].维数不定,应该要用递归: 答案: function flatten(arr){ var arrLength=arr.length; for(var i=0;i<arrLength;i++){ if(arr[i].constructor==Array){ arr.splice(i,1,flatten(arr[