格式化字符串

?最近在做的项目总是要拼接html到頁面 写了很多,诸如此类代码:

有些还需要增加button点击事件传值需要使用反斜杠转义字符串,弄得很头疼比如

刚开始只有一个人这样莋,后来其他同事全部都这样做为了尽快完成任务,我也这样做了后来越来越多这类代码。实在看不下去了于是想到能不能像java那样使用String.format()格式化字符串呢?于是去搜索发现真的有。

主要有下面这两种方式:

那么这样就方便很多了在遍历的时候使用

这种方式我比较喜欢,参数设置值时比较直观

使用方法:此种方式比较适合参数较少时使用

格式化字符串漏洞基本原理:

Printf()函數的一般形式为printf(“format”,输出表列)其第一个参数就是格式化字符串,用来告诉程序以什么格式进行输出正常情况下,这样使用:

也许代码編写者的本意只是单纯打印一段字符(如“hello world”)但如果这段字符串来源于外部用户可控的输入,则该用户完全可以在字符串中嵌入格式囮字符(如%s)那么,由于printf允许参数个数不固定故printf会自动将这段字符当作format参数,而用其后内存中的数据匹配format参数

以上图为例,假设调鼡printf(str)时的栈是这样的:

(2)如果str是format例如:%2$p,就会输出format偏移2处到内存地址的内容!

下面我们来通过ISCC pwn1的格式化字符从来进行分析:

String类的静态format()方法用于创建格式化的芓符串format()方法有两种重载形式。

该方法使用指定的格式字符串和参数返回一个格式化字符串格式化后的新字符串使用本地默认的语言环境。

?   args:格式字符串中由格式说明符引用的参数如果还有格式说明符以外的参数,则忽略这些额外的参数此参数的数目是可变的,可鉯为0

?   l:格式化过程中要应用的语言环境。如果l为null则不进行本地化。

?   args:格式字符串中由格式说明符引用的参数如果还有格式说明苻以外的参数,则忽略这些额外的参数此参数的数目是可变的,可以为0

1. 日期和时间字符串格式化

在应用程序设计中,经常需要显示時间和日期如果想输出满意的日期和时间格式,一般需要编写大量的代码经过各种算法才能实现format()方法通过给定的特殊转换符作为参数來实现对日期和时间的格式化。

先来看下面的例子返回一个月中的天数,实例代码如下:

上述代码中变量s的值是当前日期中的天数如紟天是15号,则s的值为15;%te是转换符常用的日期格式化转换符如表5.1所示。

说明:java.util.Date是Java中的时间日期类这个类表示特定的瞬间,精确到毫秒默认获取当前的时间。

表5.1  常用的日期格式化转换符

一个月中的某一天(1~31)

指定语言环境的月份简称

Feb(英文)、二月(中文)

指定语言环境嘚月份全称

February(英文)、二月(中文)

指定语言环境的星期几全称

Monday(英文)、星期一(中文)

指定语言环境的星期几简称

Mon(英文)、星期一(中文)

包括全部日期和时间信息

一年中的第几天(001~366)

一个月中的第几天(01~31)

【例】在项目中创建类Eval实现将当前日期信息以4位年份、月份全称、2位日期形式输出。 

运行结果如图5.36所示

使用format()方法不仅可以完成日期的格式化,也可以实现时间的格式化时间格式化转换符要比ㄖ期转换符更多、更精确,它可以将时间格式化为时、分、秒、毫秒格式化时间的转换符如表5.2所示。

2位数字的24时制的小时(00~23)

2位数字的12時制的小时(01~12)

1~2位数字的24时制的小时(0~23)

1~2位数字的12时制的小时(1~12)

2位数字的分钟(00~59)

2位数字的秒数(00~60)

3位数字的毫秒数(000~999)

9位数字的微秒數(9999999)

指定语言环境下上午或下午标记

下午(中文)、pm(英文)

相对于GMT RFC 82 格式的数字时区偏移量

00:00:00至现在经过的毫秒数

【例】在项目中创建类GetDate实现将当前时间信息以2位小时数、2位分钟数、2位秒数形式输出。

运行结果如图5.37所示

格式化日期与时间的转换符定义了各种日期时间组匼的格式,其中最常用的日期和时间的组合格式如表5.3所示

表5.3  常见的日期和时间组合的格式

“年-月-日”格式(4位年份)

“月/日/年”格式(2位年份)

“时:分:秒 PM(AM)”格式(12时制)

“时:分:秒”格式(24时制)

“时:分”格式(24时制)

【例】在项目中创建类DateAndTime,在主方法中实現将当前日期时间的全部信息以指定格式的日期输出

07 //将格式化后的日期时间输出

运行结果如图5.38所示。

图5.38将当前日期时间的全部信息以指萣格式的日期输出

常规类型的格式转化可应用于任何参数类型可以通过表5.4所示的转换符来实现。

结果被格式化为布尔类型

结果被格式化為字符串类型

结果被格式化为字符类型

结果被格式化为十进制整数

结果被格式化为八进制整数

结果被格式化为十六进制整数

结果被格式化為用计算机科学记数法表示的十进制数

结果被格式化为带有效位数和指数的十六进制浮点值

结果为特定于平台的行分隔符

【例】实现不同類型的格式转化

20 // 输出带有效位数和指数的16进制浮点值 23 // 输出百分号和数字

运行结果如图5.39所示。

图5.39不同类型数字的格式化

使用转换符还可鉯配合转换符标识来控制输出的格式,如表5.5所示

在最小宽度内左对其,不可以与’0’填充标识同时使用

用于8进制和16进制格式在8进制前加一个0,在16进前加一个0x

在正数前加空格在负数前加负号

在不够最小位数的结果前用0填充

只适用于10进制,每三位数字用‘’分隔

【例】使用标识控制字符串的输出格式。

03 // 让字符串输出的最大长度为5不足长度在前端补空格 20 // 让字符串输出的最大长度为5,不足长度在前端补0

运荇结果如图5.40所示

图5.40使用标识控制字符串的输出格式

本文摘自明日科技出版的《Java从入门到精通(项目案例版)》,转载请注明出处!!!

 感谢读者朋友对明日科技的支持如果您对图书中的讲解及光盘源码有任何问题,可以直接登录上的社区进行发贴把您的问题详细的说奣一下,我们的技术人员会在那里给您回复!

我要回帖

 

随机推荐