【util】用java实现16进制和byte,string的相互转换以及格式化16进制
2017-09-09 00:17
411 查看
最近程序用到的16进制比较多,所以写了一个16进制的util,供大家参考
工具类
package utils;
import java.io.UnsupportedEncodingException;
/**
*
* @author qq1623299667
*
*/
public class HexUtil {
/**
* 将任何字符串按指定编码输出成特定格式的16进制
* @param string
* @param charsetName
* @return
*/
public static String stringToHexString(String string,String charsetName) {
StringBuilder sb = new StringBuilder();
try {
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
byte[] bytes = String.valueOf(ch).getBytes(charsetName);
String hex = bytesToHexString(bytes);
sb.append(hex);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 将字节码数组按16进制的方式保存为字符串
* @param bytes
* @return
*/
public static String bytesToHexString(byte[] bytes){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int num = bytes[i] & 0xFF;
String hex = Integer.toHexString(num);
if (hex.length() < 2) {
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
}
/**
* 将16进制的字符串转换成byte
* @param hexString
* @return
*/
public static byte[] hexStringTobytes(String hexString){
StringBuilder sb = new StringBuilder();
for(int i=0;i<hexString.length()/2;i++){
sb.append(hexString.substring(2*i,2*i+2));
}
hexString = sb.toString();
byte[] bytes = new byte[hexString.length()/2];
for(int i=0;i<hexString.length()/2;i++){
bytes[i] = (byte)(0xff & Integer.parseInt(hexString.substring(2*i, 2*i+2), 16));
}
return bytes;
}
/**
* 将16进制的字符串转换成string
* @param hexString
* @return
*/
public static String hexStringToString(String hexString,String charsetName){
try {
return new String(hexStringTobytes(hexString),charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将16进制字符串按特定格式格式化
* @param hexString
* @return
*/
public static String hexStringFormat(String hexString){
StringBuilder sb = new StringBuilder();
sb.append("\r\n");
for(int i=0;i<hexString.length()/2;i++){
sb.append(hexString.substring(2*i, 2*i+2).toUpperCase());
sb.append(" ");
if(i%16==15){
sb.append("\r\n");
}
}
return sb.toString();
}
}
测试类
package utils;
/**
*
* @author qq1623299667
*
*/
public class TestRadix {
public static void main(String[] args) {
try{
//将bytes的16进制输出
String hexString1 = HexUtil.bytesToHexString("你有没有freestyle?".getBytes("utf-8"));
System.out.println(hexString1);
//将String的16进制输出
String hexString2 = HexUtil.stringToHexString("我有freestyle", "utf-8");
System.out.println(hexString2);
//将16进制的字符串转换成byte
byte[] bytes = HexUtil.hexStringTobytes(HexUtil.stringToHexString("请务必相信我真的有freestyle!", "utf-8"));
System.out.println(new String(bytes,"utf-8"));
//将16进制的字符串转换成string
String string = HexUtil.hexStringToString(HexUtil.stringToHexString("不!你骗人,你根本就没有freestyle!", "utf-8"),"utf-8");
System.out.println(string);
//将16进制格式化成特定格式
String hexStringFormat = HexUtil.hexStringFormat(HexUtil.stringToHexString("阁下果然有freestyle,是在下输了!", "utf-8"));
System.out.
4000
println(hexStringFormat);
}catch(Exception e){
e.printStackTrace();
}
}
}
输出结果
e4bda0e69c89e6b2a1e69c89667265657374796c65efbc9f
e68891e69c89667265657374796c65
请务必相信我真的有freestyle!
不!你骗人,你根本就没有freestyle!
E9 98 81 E4 B8 8B E6 9E 9C E7 84 B6 E6 9C 89 66
72 65 65 73 74 79 6C 65 2C E6 98 AF E5 9C A8 E4
B8 8B E8 BE 93 E4 BA 86 EF BC 81
工具类
package utils;
import java.io.UnsupportedEncodingException;
/**
*
* @author qq1623299667
*
*/
public class HexUtil {
/**
* 将任何字符串按指定编码输出成特定格式的16进制
* @param string
* @param charsetName
* @return
*/
public static String stringToHexString(String string,String charsetName) {
StringBuilder sb = new StringBuilder();
try {
for (int i = 0; i < string.length(); i++) {
char ch = string.charAt(i);
byte[] bytes = String.valueOf(ch).getBytes(charsetName);
String hex = bytesToHexString(bytes);
sb.append(hex);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 将字节码数组按16进制的方式保存为字符串
* @param bytes
* @return
*/
public static String bytesToHexString(byte[] bytes){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int num = bytes[i] & 0xFF;
String hex = Integer.toHexString(num);
if (hex.length() < 2) {
sb.append(0);
}
sb.append(hex);
}
return sb.toString();
}
/**
* 将16进制的字符串转换成byte
* @param hexString
* @return
*/
public static byte[] hexStringTobytes(String hexString){
StringBuilder sb = new StringBuilder();
for(int i=0;i<hexString.length()/2;i++){
sb.append(hexString.substring(2*i,2*i+2));
}
hexString = sb.toString();
byte[] bytes = new byte[hexString.length()/2];
for(int i=0;i<hexString.length()/2;i++){
bytes[i] = (byte)(0xff & Integer.parseInt(hexString.substring(2*i, 2*i+2), 16));
}
return bytes;
}
/**
* 将16进制的字符串转换成string
* @param hexString
* @return
*/
public static String hexStringToString(String hexString,String charsetName){
try {
return new String(hexStringTobytes(hexString),charsetName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将16进制字符串按特定格式格式化
* @param hexString
* @return
*/
public static String hexStringFormat(String hexString){
StringBuilder sb = new StringBuilder();
sb.append("\r\n");
for(int i=0;i<hexString.length()/2;i++){
sb.append(hexString.substring(2*i, 2*i+2).toUpperCase());
sb.append(" ");
if(i%16==15){
sb.append("\r\n");
}
}
return sb.toString();
}
}
测试类
package utils;
/**
*
* @author qq1623299667
*
*/
public class TestRadix {
public static void main(String[] args) {
try{
//将bytes的16进制输出
String hexString1 = HexUtil.bytesToHexString("你有没有freestyle?".getBytes("utf-8"));
System.out.println(hexString1);
//将String的16进制输出
String hexString2 = HexUtil.stringToHexString("我有freestyle", "utf-8");
System.out.println(hexString2);
//将16进制的字符串转换成byte
byte[] bytes = HexUtil.hexStringTobytes(HexUtil.stringToHexString("请务必相信我真的有freestyle!", "utf-8"));
System.out.println(new String(bytes,"utf-8"));
//将16进制的字符串转换成string
String string = HexUtil.hexStringToString(HexUtil.stringToHexString("不!你骗人,你根本就没有freestyle!", "utf-8"),"utf-8");
System.out.println(string);
//将16进制格式化成特定格式
String hexStringFormat = HexUtil.hexStringFormat(HexUtil.stringToHexString("阁下果然有freestyle,是在下输了!", "utf-8"));
System.out.
4000
println(hexStringFormat);
}catch(Exception e){
e.printStackTrace();
}
}
}
输出结果
e4bda0e69c89e6b2a1e69c89667265657374796c65efbc9f
e68891e69c89667265657374796c65
请务必相信我真的有freestyle!
不!你骗人,你根本就没有freestyle!
E9 98 81 E4 B8 8B E6 9E 9C E7 84 B6 E6 9C 89 66
72 65 65 73 74 79 6C 65 2C E6 98 AF E5 9C A8 E4
B8 8B E8 BE 93 E4 BA 86 EF BC 81
相关文章推荐
- java 实现 简易的base64(byte[]与String的相互转换)
- Java的String/byte[]/16进制相互转换
- JAVA中String和byte[]和InputStream之间的相互转换
- java中如何实现String转换为int double;以及double,int如何转换为String
- java实现图片与byte相互转换
- java中byte数组和String字符串怎么相互转换?(string 转 byte[]和byte[] 转 string)
- Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码
- java.util.Date和java.sql.Date之间的类型转换,以及String和Date的转换
- java.sql.Date java.util.Date String 的相互转换
- JAVA 实现Timestamp和String的相互转换
- Java byte[]数组和十六进制String之间的转换Util
- java String和byte[]转换(包括16进制String和byte[]转换)
- Java String 和 byte[] 之间的相互转换
- Java中String与byte数组的相互转换
- 16进制、10进制、字符串、中文、byte[]相互转换--->java版
- Java中有关byte和String的转换笔记和byte[]到short、int、long的相互转换
- Java String与byte[]的相互转换
- 【转载】java输入流转为文件 InputStreamToFile 以及 byte[]和InputStream的相互转换
- 使用Java来实现String字符串和Byte[]数组的转换
- Java数据类型中String、Integer、int的相互转换以及日期的转换