`
zxmzfbdc
  • 浏览: 47826 次
  • 性别: 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
分享到:
评论

相关推荐

    android byte字节数组转换十六进制字符串

    总结,Android中将字节数组转换为十六进制字符串的方法多种多样,可以根据项目需求和性能要求选择合适的方式。在开发过程中,了解并熟练掌握这些转换技巧,可以帮助我们更好地处理二进制数据,提升代码的可读性和可...

    C#字节数组转16进制字符串

    C#字节数组转16进制字符串 C#字节数组转16进制字符串 QQ:292258449

    java中进制转换(二进制,十进制,十六进制)及字节数组与十六进制的转换

    二、字节数组与十六进制字符串转换 1. **字节数组转十六进制字符串**:可以使用自定义方法或者`HexUtils`类(参考你的文件名)。例如: ```java byte[] bytes = {1, 2, 3}; String hexString = toHexString(bytes);...

    JAVA二进制字节数组字符十六进制BCD编码转换.doc

    - 示例中的`hexStringToByte()`方法将十六进制字符串转换为字节数组,而`bytesToHexString()`则将字节数组转换为十六进制字符串。 2. **字节数组** - 字节数组在Java中用`byte[]`表示,它可以存储任意字节值,常...

    16进制与字符串、字节数组之间的转换

    反之,从十六进制字符串转换回字节数组的过程也相对简单: ```csharp public static byte[] HexStringToByteArray(string hex) { int length = hex.Length / 2; byte[] bytes = new byte[length]; for (int i = 0...

    PHP CRC8算法-集成十六进制转byte数组与byte数组转十六进制

    由C代码翻译过来的PHP CRC8算法,内有十六进制转字节数组与字节数组转十六进制,内有十六进制转byte数组与byte数组转十六进制

    十六进制与字符串转换

    这个示例展示了如何使用`sprintf`将一个字节转换为十六进制字符串,以及如何使用`strtol`将一个十六进制字符串转换回字节。 在实际应用中,你可能会遇到更复杂的情况,比如处理包含多个字节的数组或者字符串,这时...

    把十六进制的位串转化为byte数组

    在描述中提到的博文链接虽然无法直接访问,但根据标题,我们可以推测博主可能分享了一种将十六进制字符串转换为字节数组的方法。通常,这种转换过程包括以下步骤: 1. **预处理**:检查输入的十六进制字符串是否...

    Lua小程序十六进制字符串和二进制数据间的转换[借鉴].pdf

    一、从十六进制字符串转换为二进制数据 在 Lua 中,可以使用 string.len 函数来获取十六进制字符串的长度,然后使用 for 循环来遍历整个字符串,使用 string.sub 函数来截取每两个字符,使用 tonumber 函数将其转换...

    ASCII码字符串(十六进制)与字节数组的互转

    4. **十六进制表示**:在LabVIEW中,有时需要将字节数组表示为十六进制字符串,这对于数据的显示和记录很有用。可以使用“字节数组到十六进制字符串”函数,将每个字节转换为其对应的十六进制表示。 5. **自定义VI*...

    十六进制字符串至普通转化_十六进制字符串转普通字符串_labview十六进制_

    要将十六进制字符串转换为普通字符串,主要步骤包括: 1. 分割十六进制字符串:由于每个ASCII字符由两个十六进制数字组成,我们需要将输入的十六进制字符串按每两个字符进行分割,形成一个十六进制数字的数组。 2....

    十六进制字符串和数值相互转换

    首先,我们要了解如何将十六进制字符串转换为整数值。在C++中,可以使用`std::stringstream`和`std::hex`函数来完成这个任务。`std::stringstream`是一个字符流,允许我们像处理输入输出流一样处理字符串;`std::hex...

    Go-此工具用于将16进制字符串转换成10进制byte数组

    本工具专注于将16进制字符串转换为10进制的byte数组,这在处理如数据库存储、加密解密、网络通信等场景中非常常见。 1. **16进制字符串与10进制byte数组的概念** - **16进制字符串**:由0-9和A-F(或a-f)字符组成...

    labview 4字节一维数组整数转为4字节16进制字符串.vi

    labview 读取的一维数组(整数)转换成16进制的字符串,方便大家进行数据处理。有问题可以留言咨询,互相学习

    C# 字符串转十六进制串,16进制反向转回原字符串

    然后,我们遍历字节数组,使用`ToString("x2")`将每个字节转换为两位的十六进制字符串,并添加到`StringBuilder`对象中。 二、十六进制串反向转回原字符串 从十六进制串还原字符串,我们需要做相反的操作:首先将...

    java实现十六进制字符unicode与中英文转换示例

    首先,它将输入的十六进制字符串转换为字节数组,然后使用这些字节尝试以UTF-8、UTF-16(与Unicode相同)、UTF-16LE(小端字节序)、UTF-16BE(大端字节序)、UTF-32以及各自的LE和BE版本进行解码。`str2all`方法则...

    C#16进制与字符串字节数组之间的转换代码

    此函数用于将一个十六进制字符串转换为字节数组。该函数首先会移除输入字符串中的所有非十六进制字符,然后检查字符串长度是否为偶数,如果不是,则在末尾添加一个空字符以保证转换正确进行。接着,通过循环遍历字符...

    byte、十进制、十六进制间的转换

    byte数组、十进制、十六进制间的两两转换

    Java实现的进制转换工具类完整示例

    3. 将字节数组转换为十六进制字符串:`public static String encodeHexStr(byte[] data)` 该方法将字节数组转换为十六进制字符串。该方法可以将字节数组转换为小写或大写的十六进制字符串,可以根据需要选择。 4. ...

Global site tag (gtag.js) - Google Analytics