C 下面的格式说明符在做什么?

C 下面的格式说明符在做什么?,c,printf,C,Printf,我无法在网上或通过阅读C编程语言书籍找到关于如何破译它的信息。我在下面的代码片段中看到了它。代码试图在telnet协议中执行密码嗅探 else { printf("\\%.3hho", *data); } if((pktlen-sizeof(struct ipheader))>dataoffset) { printf(“SrcIP:%s,”,inet_ntoa(ip->iph_sourceip));

我无法在网上或通过阅读C编程语言书籍找到关于如何破译它的信息。我在下面的代码片段中看到了它。代码试图在telnet协议中执行密码嗅探

         else
        {
            printf("\\%.3hho", *data);
        }
if((pktlen-sizeof(struct ipheader))>dataoffset)
{
printf(“SrcIP:%s,”,inet_ntoa(ip->iph_sourceip));
printf(“DstIP:%s,”,inet_ntoa(ip->iph_destip));
printf(“数据:”);
u_char*数据=(u_char*)tcp+数据偏移量;
对于(无符号短s=0;s<(ntohs(ip->iph_len)-(sizeof(struct ipheader)+dataoffset));s++)
{
如果(isprint(*数据)!=0)
{
printf(“%c”,*数据);
}
其他的
{
printf(“\\%.3Ho”,*数据);
}
数据++;
}
printf(“\n”);
}
}
根据:

转换说明符
o

将无符号整数转换为八进制表示oooo

精度指定要显示的最小位数

因此,字符串
\\%.3HO
表示一个文字反斜杠(已转义),加上格式说明符
%.3HO

  • %…o
    表示无符号整数的八进制表示。字母
    o
    也表示此说明符的结尾
  • hh
    是C99规范,表示
    无符号字符
    而不是
    无符号整数
    ,始终为单字节
  • .3
    表示精度为3,因此至少有3个八进制数字(000-377)

格式说明符以八进制打印无符号值。
hh
长度修饰符告诉它值是一个
char
,而
.3
精度意味着至少要打印3个字符。

从后到前读取格式说明符是最佳做法吗?@Papaya Automaton不一定。然而,第一步是确定格式说明符的结束位置(在我的回答中,
%…o
项目符号)。然后,因为长度修饰符总是字母,一些人可能会发现一起阅读它们更容易(
ld
llu
hhx
等)。你也可以“前进”:1)“%”启动格式说明符,2)“.”表示“精度”如下,3)'3'是精度的值,4)'h'是长度修饰符,5)第二个“h”修改存储的长度修饰符,最后6)“o”是关闭整体的转换说明符。在第6步之后,很清楚如何解释修饰符。
if ((pktlen - sizeof(struct ipheader)) >  dataoffset)
{
    printf("   SrcIP: %s,", inet_ntoa(ip->iph_sourceip));
    printf(" DstIP: %s,", inet_ntoa(ip->iph_destip));
    printf(" Data: ");
    u_char* data = (u_char*)tcp + dataoffset;

    for (unsigned short s = 0; s < (ntohs(ip->iph_len) - (sizeof(struct ipheader) + dataoffset)); s++)
    {
        if (isprint(*data) != 0)
        {
          printf("%c", *data);
                                  }
        else
        {
            printf("\\%.3hho", *data);
        }
        data++;
    }
    printf("\n");
  }

}