2013-02-27 197 views
34

我有一个小问题。我知道%x格式说明符可以用来从格式字符串攻击中读取堆栈中的值。C - %x格式说明符

我发现下面的代码:

​​3210

什么是08呢?它究竟做了什么?谢谢:)

+1

字段宽度为8个字符,较短的数字前缀为前导零以匹配字段宽度,例如, '000007ac'或'0005ceef'。 – 2013-02-27 09:53:17

+1

这是在说什么功能?你说“读取值”,但所有的答案似乎都假定正在使用'printf()'。 – unwind 2013-02-27 10:10:03

+0

@unwind好点。我们都在为printf写作。 – 2013-02-27 10:16:48

回答

82

击穿:

  • 8说,你想显示8个位数
  • 0要与0的,而不是仅仅空格
  • 前缀
  • x您要以小写十六进制打印。

快速示例(感谢Grijesh Chauhan保持):

#include <stdio.h> 
int main() { 
    int data = 29; 
    printf("%x\n", data); // just print data 
    printf("%0x\n", data); // just print data ('0' on its own has no effect) 
    printf("%8x\n", data); // print in 8 width and pad with blank spaces 
    printf("%08x\n", data); // print in 8 width and pad with 0's 

    return 0; 
} 

输出:

1d 
1d 
     1d 
0000001d 

另见http://www.cplusplus.com/reference/cstdio/printf/以供参考。

+3

增加了一个希望你喜欢的例子。如果不是你可以恢复到你的版本 – 2013-02-27 10:01:34

+0

非常感谢你:)))这正是我需要的:) – Matthew 2013-02-27 10:33:02

+0

@Matthew你也应该尝试'%-8x'和大写'X'。并观察效果 – 2013-02-27 10:37:40

2

它指定你想显示多少位数。

整数值或*指定最小字段宽度。如果需要,结果会填充空格字符(默认情况下),右侧对齐时填充空白字符,左侧填充右侧填充。在使用*的情况下,宽度由类型为int的附加参数指定。如果参数的值是负值,那么结果是指定 - 标志和正字段宽度。

2

%08x表示每个数字至少应打印8个字符,并填写所有缺少的数字,例如0。为“1”的输出将是00000001