精选文章

Android下使用TCPDUMP抓包Wireshark分析数据 如果想分析Android下某个APP的网络数据交互,需要在Android手机上抓包,最常用的抓包工具非tcpdump莫属,用tcpdump生成Wireshark识别的pcap文件,然后将pcap文件下载到电脑上,用电脑上的Wireshark加载pcap文件,通过Wireshark分析tcpdump抓取的数据。...

继续阅读

Mac下部署Android开发环境附加NDK 作为开发者,我们深有体会,不管是进行什么开发,为了部署开发环境,我们往往需要折腾很长时间、查阅很多资料才能完成,而且这次折腾完了,下次到了另一台新电脑上又得重新来过,整个部署过程记得还好,要是不记得又得重新开始,而且遇到Android这种GFW阻隔了开发资源下载链接的环境部署,又尤其浪费时间。所以这也是我写下这篇教程的初衷跟动力源泉,希望大家参考了这篇教程以后可以轻轻松松在Mac系统下将Android环境部署好。...

继续阅读

稍顯嚴肅的台中 坦白說,留在腦海中的台中影像並不多,來台灣之前在Booking上只訂到了台中的一家青旅,第一次住青旅有些不習慣,幹什麼都放不開。 同屋的一個男生是台灣人,不過一年中四分之三的時間在上海跟北京,這麼說來跟我還是比較有共同話題的。得之我準備花15天的時間環島,覺得太倉促了,他們大學時期花一個半月的時間也不見得能將台灣島給逛完。我只能無奈地表示,兩岸允許的簽證時間有限,自己的空閒時間更有限,只能用打卡式的旅行了,我深知正真地旅行應該慢下來,融入當地的環境,感受他們的風土人情,但第一次只能這樣作罷,以後換成民進黨上台,形勢會變成怎樣還不得而知,能否再過來還是個未知數。而我一向信奉的人生格言是秉燭夜遊,活在當下,所以,理解自己吧。...

继续阅读

為之留戀的新竹 來新竹之前本沒有對她有過高的期待,慢慢對她加分要從桃園火車站出發前往新竹開始。 在桃園火車站的候車月台上,有醒目的旅遊資料發放處,這上面的擺放的全是新竹的旅遊宣傳資料,關鍵的是資料做得非常簡潔易懂,而接下來一天的新竹之行就全部是依據這份寶典的指引來完成的。...

继续阅读

從桃園開始台灣之行 初到台灣恰逢華夏銀行系統升級,特意準備的華夏銀聯卡在桃園機場沒能派上用場,只好用建行在機場5000塊,算下來是很不划算的,但是沒辦法,誰叫我出機場就得花錢呢。 從機場打車到桃園的酒店,花了將近六百塊新台幣,到酒店時五點多,天已經漸亮了,洗漱完等到七點吃過早餐就開始補覺囉,一覺醒來已是中午,帶著換下來的衣服外出找自助洗衣店,順便覓食。...

继续阅读

  • Prev
  • Next

格式化数据输出函数hexdump

4

文章分类 : C语言, 应用与编程, 网络

不知道大家是否使用过网络数据抓包工具WireShark,Wireshark能够捕捉出入网卡的每一帧网络包,并能够详细列出网络包的源IP地址、目的IP地址、端口号、协议类型以及数据内容等信息。在数据(Data)一栏,Wireshark按照下图样式将数据(Data)按十六进制以及字符的形式打印出来。这样的打印信息清晰而明了,下面我们就来编写一个格式化数据输出函数hexdump吧。    

Wireshark数据打印

void hexdump (char *buf, int len)
{
    register int m;
    register int n;
    register char *data;
    data=buf;
    for (m=0;m<len;m++)
    {
        if( (!(m%2)) && (m!=0) ) fprintf (stderr, " ");
        if( (!(m%20)) && (m!=0) )
        {
            for (n=20;n>0;n--)
            {
                if ((*(data+m-n)>31) && (*(data+m-n)<127))
                    fprintf (stderr, "%c", *(data+m-n));
                else
                    fprintf (stderr, ".");
            }
            fprintf (stderr, "\n");
        }
        fprintf (stderr, "%02x",*(data+m));
    }
    for (m=0;m<(20-((len%20)?(len%20):20))*2+(10-((len%20)?(len%20-1):19)/2);m++)
        fprintf (stderr, " ");
    for (m=len-((len%20)?(len%20):20);m<len;m++)
    {
        if ((*(data+m)>31) && (*(data+m)<127))
            fprintf (stderr, "%c", *(data+m));
        else
            fprintf (stderr, ".");
    }
    fprintf (stderr, "\n\n");
}

注释:

1、register这个关键字告诉编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。

2、因为ASCII码中的可显字符范围是32得到126,所以才有了“if ((*(data+m-n)>31) && (*(data+m-n)<127))”这一行,其他不可见的控制字符用“.”代替打印出来。

运行结果示例:

4861 6965 7200 0069 1500 0000 0000 0000 0000 0000 Haier..i............
3836 3065 6236 3961 6361 6539 3900 0000 0031 2e30 860eb69acae99....1.0
2e30 0000 0055 4449 5343 4f56 4552 595f 5041 4400 .0...UDISCOVERY_PAD.
0000 0000 0000 0000 0000 0000 0000 0000 00        .................

除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。

本文地址:https://www.cpplive.com/html/1391.html

评论 (4)

  • kaven says:

    🙂 void hexdump (char *buf, int len) 中的buf从哪里来?是自己保存文本然后去open 、read?

  • 这里因为你的留言而存在!!!

    You must be logged in to post a comment.