格式化字符串

原创 2013年12月05日 16:21:37

Formatter类:printf 风格的格式字符串的解释程序。此类提供了对布局对齐和排列的支持,以及对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。支持诸如 byte、BigDecimalCalendar 等常见 Java 类型。

1. 主要讲下字符串的格式化,上个例子:
package string;

import java.util.Formatter;

public class Turtle {
	
	private String name;
	private Formatter format;
	
	public Turtle(String name, Formatter format) {
		this.name = name;
		this.format = format;
	}
	
	public void move(int x, int y) {
		//%s 格式化字符串    %d格式化整数
		format.format("%s The Turtle is at (%d, %d),\n", name, x, y);
	}
	
	public static void main(String[] args) {
		Turtle t1 = new Turtle("xiaoqiang", new Formatter(System.out));
		t1.move(0, 0);
		t1.move(0, 3);
		t1.move(0, 6);
		t1.move(3, 6);
	}
	
}
//output
xiaoqiang The Turtle is at (0, 0).
xiaoqiang The Turtle is at (0, 3).
xiaoqiang The Turtle is at (0, 6).
xiaoqiang The Turtle is at (3, 6).
2 .排版格式的控制能力
package string;

import java.util.Formatter;

public class Receipt {
	
	private double total = 0;
	private Formatter f = new Formatter(System.out);
	
	public void printTitle() {
		//-表示左对齐
		f.format("%-15s %5s %10s\n", "Item", "Qty", "Price");
		f.format("%-15s %5s %10s\n", "---", "---", "---");
	}
	
	public void print(String item, int qty, double price) {
		f.format("%-15.15s %5d %10.2f\n", item, qty, price);
		total += price;
	}
	
	public void printTotal() {
		f.format("%-15s %5s %10.2f\n", "Tax", "", total*0.06);
		f.format("%-15s %5s %10s\n", "", "", "---");
		f.format("%-15s %5s %10.2f\n", "Total", "", total*1.06);
		
	}
	
	public static void main(String[] args) {
		Receipt r = new Receipt();
		r.printTitle();
		r.print("big ice", 2, 9);
		r.print("little ice", 1, 1.25);
		r.print("old ice", 5, 5.5);
		r.printTotal();
	}
	
}
//output
Item              Qty      Price
---               ---        ---
big ice             2       9.00
little ice          1       1.25
old ice             5       5.50
Tax                         0.95
                             ---
Total                      16.70
3.类型转换
package string;

import java.math.BigInteger;
import java.util.Formatter;

public class Conversion {
	
	public static void main(String[] args) {
		Formatter f = new Formatter(System.out);
		char u = 'a';
		System.out.println("--------u = 'a'");
		f.format("s: %s\n", u);  //字符串
		f.format("c: %c\n", u);  //Unicode  字符
		f.format("b: %b\n", u);  //boolean值
		f.format("h: %h\n", u);  //16进制哈希值
		
		int v = 21;
		System.out.println("\n----------v = 21");
		f.format("d: %d\n", v);  //十进制整数
		f.format("c: %c\n", v);  //Unicode  字符
		f.format("b: %b\n", v);  //boolean值
		f.format("s: %s\n", v);  //字符串
		f.format("x: %x\n", v);  //16进制整数
		f.format("h: %h\n", v);  //16进制哈希值  hasCode-->toHex
		
		BigInteger w = new BigInteger("5000000000000");
		System.out.println("\n-------w = new BigInteger(\"5000000000000\")");
		f.format("d: %d\n", w);  //十进制整数
		f.format("b: %b\n", w);  //boolean值
		f.format("s: %s\n", w);  //字符串
		f.format("x: %x\n", w);  //16进制整数
		f.format("h: %h\n", w);  //16进制哈希值  hasCode-->toHex
		
		double x = 1234.567;
		System.out.println("\n-------x = 1234.567");
		f.format("b: %b\n", x);  //boolean
		f.format("s: %s\n", x);  //字符串
		f.format("f: %f\n", x);  //float
		f.format("e: %e\n", x);  //计算机科学记数法表示的十进制数
		f.format("h: %h\n", x);  //16进制哈希值  hasCode-->toHex
		
		Conversion c = new Conversion();
		System.out.println("\n-------c = new Conversion()");
		f.format("b: %b\n", c);  //boolean
		f.format("s: %s\n", c);  //字符串
		f.format("h: %h\n", c);  //16进制哈希值  hasCode-->toHex
		
		boolean b = false;
		System.out.println("\n-------b = false");
		f.format("b: %b\n", b);  //boolean
		f.format("s: %s\n", b);  //字符串
		f.format("h: %h\n", b);  //16进制哈希值  hasCode-->toHex
	}
}
4. String.format :静态方法,实际使用的Formatter类,可简化编程
package string;

public class Hex {
	
	//byte[]数组做16进制输出
	public static String format(byte[] bytes) {
		StringBuilder sb = new StringBuilder();
		int n = 0;
		for(byte b : bytes) {
			if(n % 16 == 0) {
				sb.append(String.format("%05X : ", n));
			}
			sb.append(String.format("%02X ", b));
			n++;
			if(n % 16 == 0) {
				sb.append("\n");
			}
		}
		sb.append("\n");
		return sb.toString();
	} 
	
	public static void main(String[] args) {
		System.out.println(format("xiaoqiangqumaidabinggun".getBytes()));
	}
	
}
5. System.out.printf()   System.out.format() 同样使用Formatter进行格式化输出
6. 格式化输出的语法JDK的API中很详细了,这里主要描述一些应用场景和类的关系

格式化字符串漏洞简介

简介格式化字符串,也是一种比较常见的漏洞类型。
  • PrettyDay
  • PrettyDay
  • 2015年12月20日 23:27
  • 4634

ISCC之pwn1格式化字符串漏洞详解!

作为小白的我,自从入了ctf的坑就再也没爬起来过,从无到有实在是很辛苦。仅以此片纪念我的青春。   直接进入正题。这是个很明显的32位的格式化字符串漏洞。 上手就先leak出libc地址,求偏移得到...
  • qq_33438733
  • qq_33438733
  • 2017年05月29日 19:46
  • 545

c++格式化字符串

选自《CSDN 社区电子杂志——C/C++杂志》 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的...
  • Road2010
  • Road2010
  • 2014年06月07日 10:12
  • 530

某道Pwn(格式化字符串漏洞)

格式化字符串漏洞近几年出现频率少了,但是一些 CTF 中还有涉及,就当玩玩好了。首先看这一段代码,什么比赛的题我忘了:#include int main(void) { int flag ...
  • wizardforcel
  • wizardforcel
  • 2017年03月18日 14:14
  • 1215

c语言中的格式化字符串

C语言中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型, 其中方括号[]中的项为可选项。 一、类型 我们用一定的字符用以表示输出数据的类型,其格式符和意义下表所示:...
  • MyLinChi
  • MyLinChi
  • 2016年11月10日 16:09
  • 2458

格式化字符串漏洞执行任意代码分析

首先使用vc++6.0编译一个程序FormatStr.exe,源代码: 代码: _#include  #include  int main (int argc, char *argv[]) {  ...
  • qq_35519254
  • qq_35519254
  • 2016年10月10日 11:05
  • 1243

C# 各种格式化字符串

 1、格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0.20) ...
  • qq61394323
  • qq61394323
  • 2016年12月06日 09:58
  • 1252

python整理三——用字典格式化字符串

 惯用的格式化字符串跟C/C++特别像,如: >>> s1 = Hello,%s %d. % (Python, 3000)>>> s1Hello,Python 3000.这种方法很C/C++很像,用起...
  • hong201
  • hong201
  • 2008年09月02日 19:37
  • 2432

C/C++格式化字符串说明

C/C++格式化字符串说明 1. 格式化规定符 ━━━━━━━━━━━━━━━━━━━━━━━━━━    符号                  作用 ───────────────...
  • bzhxuexi
  • bzhxuexi
  • 2014年04月29日 22:44
  • 2737

格式化字符串攻击原理及示例

一、类printf函数簇实现原理类printf函数的最大的特点就是,在函数定义的时候无法知道函数实参的数目和类型。对于这种情况,可以使用省略号指定参数表。带有省略号的函数定义中,参数表分为两部分,前半...
  • immcss
  • immcss
  • 2011年03月22日 14:20
  • 11362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:格式化字符串
举报原因:
原因补充:

(最多只允许输入30个字)