Java的16进制与字符串的相互转换函数

/**
* 将指定byte数组以16进制的形式打印到控制台
* @param hint String
* @param b byte[]
* @return void
*/
public static void printHexString(String hint, byte[] b) {
System.out.print(hint);
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
System.out.print(hex.toUpperCase() + " ");
}
System.out.println("");
}
/**
*
* @param b byte[]
* @return String
*/
public static String Bytes2HexString(byte[] b) {
String ret = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
ret += hex.toUpperCase();
}
return ret;
}
/**
* 将两个ASCII字符合成一个字节;
* 如:"EF"--> 0xEF
* @param src0 byte
* @param src1 byte
* @return byte
*/
public static byte uniteBytes(byte src0, byte src1) {
byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
_b0 = (byte)(_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
byte ret = (byte)(_b0 ^ _b1);
return ret;
}
/**
* 将指定字符串src,以每两个字符分割转换为16进制形式
* 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9}
* @param src String
* @return byte[]
*/
public static byte[] HexString2Bytes(String src){
byte[] ret = new byte[8];
byte[] tmp = src.getBytes();
for(int i=0; i<8; i++){
ret[i] = uniteBytes(tmp[i*2], tmp[i*2+1]);
}
return ret;

}



-------------------------------------------------------------------------------------------------------------

public static String stringToHexString(String strPart) {
<wbr><wbr><wbr><wbr><wbr><wbr><wbr> String hexString = "";<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> for (int i = 0; i &lt; strPart.length(); i++) {<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> int ch = (int) strPart.charAt(i);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> String strHex = Integer.toHexString(ch);<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr> hexString = hexString + strHex;<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> }<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr> return hexString;<br><wbr><wbr><wbr> }<br><br> private static String hexString="0123456789ABCDEF";<br><br> public static String encode(String str)<br> {<br> // 根据默认编码获取字节数组<br> byte[] bytes=str.getBytes();<br> StringBuilder sb=new StringBuilder(bytes.length*2);<br> // 将字节数组中每个字节拆解成2位16进制整数<br> for(int i=0;i&lt;bytes.length;i++)<br> {<br> sb.append(hexString.charAt((bytes[i]&amp;0xf0)&gt;&gt;4));<br> sb.append(hexString.charAt((bytes[i]&amp;0x0f)&gt;&gt;0));<br> }<br> return sb.toString();<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>


public static String decode(String bytes)
{
ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);
// 将每2位16进制整数组装成一个字节
for(int i=0;i<bytes.length();i+=2)
baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));
return new String(baos.toByteArray());
}

private static byte uniteBytes(byte src0, byte src1) {
<wbr><wbr><wbr><wbr> byte _b0 = Byte.decode("0x" + new String(new byte[] {src0})).byteValue();<br><wbr><wbr><wbr><wbr> _b0 = (byte) (_b0 &lt;&lt; 4);<br><wbr><wbr><wbr><wbr> byte _b1 = Byte.decode("0x" + new String(new byte[] {src1})).byteValue();<br><wbr><wbr><wbr><wbr> byte ret = (byte) (_b0 | _b1);<br><wbr><wbr><wbr><wbr> return ret;<br><br> public static byte[] HexString2Bytes(String src)<br> {<br><wbr><wbr> byte[] ret = new byte[6];<br><wbr><wbr> byte[] tmp = src.getBytes();<br><wbr><wbr> for(int i=0; i&lt;6; ++i )<br><wbr><wbr> {<br><wbr><wbr><wbr> ret[i] = uniteBytes(tmp[i*2], tmp[i*2+1]);<br><wbr><wbr><wbr><wbr><wbr> }<br><wbr><wbr> return ret;<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr></wbr>

<wbr>====================================================================</wbr>

java 格式化输出十六进制数
<wbr><wbr><wbr>// 以16进制输出文件内容, 每16个数换行一次<br><wbr><wbr><wbr>for(int i = 0; i &lt; nLen; i++)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr>if(i % 16 == 0)<br><wbr><wbr><wbr><wbr><wbr>System.out.println();<br><wbr><wbr><wbr><wbr>String strHex = new String();<br><wbr><wbr><wbr><wbr>strHex = Integer.toHexString(chBuf[i]).toUpperCase();<br><wbr><wbr><wbr><wbr>if(strHex.length() &gt; 3)<br><wbr><wbr><wbr><wbr><wbr>System.out.print(strHex.substring(6));<br><wbr><wbr><wbr><wbr>else<br><wbr><wbr><wbr><wbr><wbr>if(strHex.length() &lt; 2)<br><wbr><wbr><wbr><wbr><wbr><wbr>System.out.print("0" + strHex);<br><wbr><wbr><wbr><wbr><wbr>else<br><wbr><wbr><wbr><wbr><wbr><wbr>System.out.print(strHex);<br><wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr>System.out.print(" ");<br><wbr><wbr><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
输出结果
-----------------------------------------------------------------------
FF D8 FF E0 00 10 4A 46 49 46 00 01 01 00 00 01
00 01 00 00 FF E1 00 E6 45 78 69 66 00 00 49 49
2A 00 08 00 00 00 05 00 12 01 03 00 01 00 00 00
01 00 00 00 31 01 02 00 1C 00 00 00 4A 00 00 00
32 01 02 00 14 00 00 00 66 00 00 00 13 02 03 00
01 00 00 00 01 00 00 00 69 87 04 00 01 00 00 00
7A 00 00 00
<wbr></wbr>
=================================
当我们把string字符串转成byte[]后,要再转成string 通过String.valueof()是实现不了的,只能new string(byte [])。
呵呵,我在使用java<wbr>3des数据加密的时候,byte转string,存到文件,再取出string再转byte还是不对的,所以new<wbr>string(byte<wbr>[])也不见得会得到正确结果的!!最后我是采用byte转成16进制字符串,然后再将16进制字符串转换成byte才可以的.</wbr></wbr></wbr>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值