`
frank1998819
  • 浏览: 733345 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

字节数组和十六进制字符串的转换 (转)

    博客分类:
  • Java
 
阅读更多

在实际中会遇到这样的需求,即将一个字符串转换成二进制数组,但二进制数组的传输却并不方便,例如通过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
 }
}

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics