`
zxmzfbdc
  • 浏览: 47124 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

【原创】字节数组和十六进制字符串的转换

 
阅读更多

  在实际中会遇到这样的需求,即将一个字符串转换成二进制数组,但二进制数组的传输却并不方便,例如通过HTTP协议传输,因此需要把二进制字节数组转换成十六进制字符串,接收方接收该字符串以后,再把它转换成二进制字节数组。这有一个好处,就是可以避免乱码,从来适用于各种场合,有很好的适应性。

  我所遇到的情况是,出于安全的考虑,需要对信息进行加密,但加密后返回的是字节数组,无法将加密后的数据直接放在文本中使用,而实际又有这样的需求,因此也需要这样的转换。以下就是实现,希望能对有需要的朋友有些帮助。

/**
 * ByteHEXUtils.java created by Dirac on 2013-7-30
 */
package com.into4g.service.util;

/**
 * @author Dirac
 * @since 2013-7-30
 */
public class ByteHEXUtils {
	static final byte[] HEX_TABLE = {0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF};
	static final char[] HEX_CHAR_TABLE = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	
	public String toHexString(byte[] data) throws Exception{
		if(data==null || data.length==0)return null;
		byte[] hex = new byte[data.length*2];
		int index = 0;
		for(byte b: data){
			int v = b & 0xFF;
			hex[index++] = (byte)HEX_CHAR_TABLE[v>>>4];
			hex[index++] = (byte)HEX_CHAR_TABLE[v&0xF];
		}
		return new String(hex);
	}
	
	public byte[] hexToByte(String hexString){
		if(hexString==null || hexString.length()==0)return null;
		if(hexString.length()%2!=0)throw new RuntimeException();
		byte[] data = new byte[hexString.length()/2];
		char[] chars = hexString.toCharArray();
		for(int i=0;i<hexString.length();i=i+2){
			data[i/2] = (byte)(HEX_TABLE[getHexCharValue(chars[i])]<<4 | HEX_TABLE[getHexCharValue(chars[i+1])]);
		}
		return data;
	}
	
	private int getHexCharValue(char c){
		int index = 0;
		for(char c1: HEX_CHAR_TABLE){
			if(c==c1){
				return index;
			}
			index++;
		}
		return 0;
	}
}

 测试代码:

/**
 * ByteHEXUtilsTest.java created by Dirac on 2013-7-30
 */
package com.into4g.service.util;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

/**
 * @author Dirac
 * @since 2013-7-30
 */
public class ByteHEXUtilsTest {
	private ByteHEXUtils utils;
	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		utils = new ByteHEXUtils();
	}

	/**
	 * Test method for {@link com.into4g.service.util.ByteHEXUtils#toHexString(byte[])}.
	 * @throws Exception 
	 */
	@Test
	public final void testToHexString() throws Exception {
		byte[] bytes = "岁月是把杀猪刀,人生任由他宰割。".getBytes("utf-8");
		String data = utils.toHexString(bytes);
		System.out.println(data);
		assertTrue(true);
		//fail("Not yet implemented"); // TODO
	}

	/**
	 * Test method for {@link com.into4g.service.util.ByteHEXUtils#hexToByte(java.lang.String)}.
	 */
	@Test
	public final void testHexToByte() throws Exception{
		byte[] data = utils.hexToByte("E5B281E69C88E698AFE68A8AE69D80E78CAAE58880EFBC8CE4BABAE7949FE4BBBBE794B1E4BB96E5AEB0E589B2E38082");
		String str = new String(data, "utf-8");
		System.out.println("str======="+str);
		//fail("Not yet implemented"); // TODO
	}
}

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics