`

Java中byte与16进制字符串的转换

    博客分类:
  • java
 
阅读更多

因工作上经常用到byte转换成16进制字符串、16进制字符串转换为byte等,故将相关知识整理一下:

 

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte转换到16进制字符串的结果new String(H) + new String(L)。即byte用十六进制表示只占2位。

同理,相反的转换也是将两个16进制字符转换成一个byte,原理同上。

根据以上原理,我们就可以将byte[] 数组转换为16进制字符串了,当然也可以将16进制字符串转换为byte[]数组了。

package com.ljf;

import java.util.Locale;

public class CHexConver {
	
	private final static char[] mChars = "0123456789ABCDEF".toCharArray();  
	private final static String mHexStr = "0123456789ABCDEF";  
	
    /**  
     * 检查16进制字符串是否有效 
     * @param sHex String 16进制字符串 
     * @return boolean 
     */    
    public static boolean checkHexStr(String sHex){    
        String sTmp = sHex.toString().trim().replace(" ", "").toUpperCase(Locale.US);  
        int iLen = sTmp.length();  
          
        if (iLen > 1 && iLen%2 == 0){  
            for(int i=0; i<iLen; i++)  
                if (!mHexStr.contains(sTmp.substring(i, i+1)))  
                    return false;  
            return true;  
        }  
        else  
            return false;  
    }  
    
    /**  
     * 字符串转换成十六进制字符串 
     * @param str String 待转换的ASCII字符串 
     * @return String 每个Byte之间空格分隔,如: [61 6C 6B] 
     */    
    public static String str2HexStr(String str){    
        StringBuilder sb = new StringBuilder();  
        byte[] bs = str.getBytes();    
          
        for (int i = 0; i < bs.length; i++){    
            sb.append(mChars[(bs[i] & 0xFF) >> 4]);    
            sb.append(mChars[bs[i] & 0x0F]);  
            sb.append(' ');  
        }    
        return sb.toString().trim();    
    }
    
    /**  
     * 十六进制字符串转换成 ASCII字符串 
     * @param str String Byte字符串 
     * @return String 对应的字符串 
     */    
    public static String hexStr2Str(String hexStr){    
        hexStr = hexStr.toString().trim().replace(" ", "").toUpperCase(Locale.US);  
        char[] hexs = hexStr.toCharArray();    
        byte[] bytes = new byte[hexStr.length() / 2];    
        int iTmp = 0x00;;    
  
        for (int i = 0; i < bytes.length; i++){    
            iTmp = mHexStr.indexOf(hexs[2 * i]) << 4;    
            iTmp |= mHexStr.indexOf(hexs[2 * i + 1]);    
            bytes[i] = (byte) (iTmp & 0xFF);    
        }    
        return new String(bytes);    
    }
    
    /** 
     * bytes字符串转换为Byte值 
     * @param src String Byte字符串,每个Byte之间没有分隔符(字符范围:0-9 A-F) 
     * @return byte[] 
     */  
    public static byte[] hexStr2Bytes(String src){  
        /*对输入值进行规范化整理*/  
        src = src.trim().replace(" ", "").toUpperCase(Locale.US);  
        //处理值初始化  
        int m=0,n=0;  
        int iLen=src.length()/2; //计算长度  
        byte[] ret = new byte[iLen]; //分配存储空间  
          
        for (int i = 0; i < iLen; i++){  
            m=i*2+1;  
            n=m+1;  
            ret[i] = (byte)(Integer.decode("0x"+ src.substring(i*2, m) + src.substring(m,n)) & 0xFF);  
        }  
        return ret;  
    } 

    /** 
     * String的字符串转换成unicode的String 
     * @param strText String 全角字符串 
     * @return String 每个unicode之间无分隔符 
     * @throws Exception 
     */  
    public static String strToUnicode(String strText)  
        throws Exception  
    {  
        char c;  
        StringBuilder str = new StringBuilder();  
        int intAsc;  
        String strHex;  
        for (int i = 0; i < strText.length(); i++){  
            c = strText.charAt(i);  
            intAsc = (int) c;  
            strHex = Integer.toHexString(intAsc);  
            if (intAsc > 128)  
                str.append("\\u");  
            else // 低位在前面补00  
                str.append("\\u00");  
            str.append(strHex);  
        }  
        return str.toString();  
    }
    
    /** 
     * unicode的String转换成String的字符串 
     * @param hex String 16进制值字符串 (一个unicode为2byte) 
     * @return String 全角字符串 
     * @see CHexConver.unicodeToString("\\u0068\\u0065\\u006c\\u006c\\u006f") 
     */  
    public static String unicodeToString(String hex){  
        int t = hex.length() / 6;  
        int iTmp = 0;  
        StringBuilder str = new StringBuilder();  
        for (int i = 0; i < t; i++){  
            String s = hex.substring(i * 6, (i + 1) * 6);  
            // 将16进制的string转为int  
            iTmp = (Integer.valueOf(s.substring(2, 4), 16) << 8) | Integer.valueOf(s.substring(4), 16);  
            // 将int转换为字符  
            str.append(new String(Character.toChars(iTmp)));  
        }  
        return str.toString();  
    }  
    
	/**
	 * Convert byte[] to hex string.这里我们可以将byte转换成int<br>
	 * 然后利用Integer.toHexString(int)来转换成16进制字符串。  
	 * @param src byte[] data  
	 * @return hex string  
	 */     
	public static String bytesToHexString(byte[] src){  
	    StringBuilder stringBuilder = new StringBuilder("");  
	    if (src == null || src.length <= 0) {  
	        return null;  
	    }  
	    for (int i = 0; i < src.length; i++) {  
	        int v = src[i] & 0xFF;  
	        String hv = Integer.toHexString(v);  
	        if (hv.length() < 2) {  
	            stringBuilder.append(0);  
	        }  
	        stringBuilder.append(hv);  
	    }  
	    return stringBuilder.toString();  
	} 
	/** 
	 * Convert hex string to byte[] 
	 * @param hexString the hex string 
	 * @return byte[] 
	 */  
	public static byte[] hexStringToBytes(String hexString) {  
	    if (hexString == null || hexString.equals("")) {  
	        return null;  
	    }  
	    hexString = hexString.toUpperCase();  
	    int length = hexString.length() / 2;  
	    char[] hexChars = hexString.toCharArray();  
	    byte[] d = new byte[length];  
	    for (int i = 0; i < length; i++) {  
	        int pos = i * 2;  
	        d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));  
	    }  
	    return d;  
	} 
	
	/**
	 * 将指定byte数组以16进制的形式打印到控制台  
	 * @param b
	 */
	public static void printHexString( byte[] b) {    
	   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() );   
	   }   
	  
	}
	
	/** 
	 * Convert char to byte 
	 * @param c char 
	 * @return byte 
	 */  
	 private static byte charToByte(char c) {  
	    return (byte) "0123456789ABCDEF".indexOf(c);  
	} 

}

 

分享到:
评论

相关推荐

    java16进制与字符串的转换.pdf

    在 Java 中,我们可以使用 `HexString2Bytes` 函数将 16 进制字符串转换为 byte 数组。该函数接受一个参数 src,即 16 进制字符串,然后将其转换为 byte 数组。 ```java public static byte[] HexString2Bytes...

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

    在Android开发中,有时我们需要将字节数组(byte array)转换为十六进制字符串,以便于数据存储、传输或调试。这是因为字节数组是二进制数据,而十六进制字符串则是一种人类可读的表示方式。下面我们将详细讨论如何...

    java String 与各种进制字符之间的转换

    - `Integer.toHexString()`和`Integer.parseInt(hexStr, 16)`是十六进制字符串与整数之间转换的常用方法。 4. **字符编码与解码**: Java中的`Character`类提供了处理单个字符的方法。例如,可以使用`Character....

    Java中3DES加密解密示例(封装byte数组16进制互转)

    在 hex2Byte 方法中,我们将 16 进制字符串转换回 byte 数组。我们使用 Integer.decode 方法来将 16 进制字符串转换回 byte 数组中的每个元素。 示例代码 在本示例中,我们提供了一个示例代码,展示如何使用 3DES ...

    java 字符串转16进制Ascii

    在Java编程语言中,将字符串转换为16进制ASCII值是一个常见的操作,尤其是在处理数据编码、网络通信或存储时。这个过程涉及到字符到数字的转换,并且通常使用`Character`类和`Integer`类的方法来完成。让我们深入...

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

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

    java16进制与字符串的转换借鉴.pdf

    - `HexString2Bytes`方法实现了将16进制字符串转换为字节数组。它首先创建一个目标数组,然后遍历输入字符串的每个字符对,将每两个字符视为一个16进制数字,通过`uniteBytes`方法合并成一个字节并存入数组。`...

    android字符串和16进制转换

    反过来,将16进制字符串转换回ASCII字符串,我们需要将16进制字符串分割成单个字符,然后将它们解析为整数,最后将这些整数转换回相应的字符。这里有一个示例: ```java public String hexToString(String hex) { ...

    java 16进制表示的字符串转换为字节数组 工具类

    /** * 16进制表示的字符串转换为字节数组 * @param hexString 16进制表示的字符串 *... i += 2) { // 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节 bytes[i / 2] = (byte) ((Character.digit(hexS

    java 二进制数据与16进制字符串相互转化方法

    这个方法将 16 进制字符串转换为二进制数据,每个十六进制数字都对应一个 byte。例如,输入字符串 "4567",输出结果将是一个 byte 数组 {0x45, 0x67}。 Java 中二进制数据与 16 进制字符串相互转换的方法可以使用...

    十六进制字符串按位异或运算工具和java位异或运算

    在上述代码中,`Integer.parseInt(hexNumber, 16)`使用了第二个参数16来指定解析的基数为16,从而将十六进制字符串转换为十进制整数。然后,通过`result ^= binaryValue`进行异或运算,将每个十六进制数的结果累加到...

    通过java编程得到.jpg图片16进制的数据

    3. **字节与16进制转换**:Java中的`Integer.toHexString()`方法是将一个整数转换为16进制字符串的关键。由于图片文件由字节组成,我们需要先读取这些字节,然后逐个转换成16进制。 4. **位操作**:如果需要读取....

    java工具类 string转10进制sacii byte数组再转16进制字符数组再转16进制byte数组 string与BCD互转

    java工具类 : string转10进制sacii byte数组、 10进制sacii byte数组转16进制字符数组、 16进制字符数组转16进制byte数组、 string与BCD互转等方法,包含多个转换方法, 足够满足日常解包组包需求

    Java-byte数组转换成16进制字符串

    Java-byte数组转换成16进制字符串

    java socket处理硬件传过来的16进制数据的工具类

    java socket处理硬件传过来的16进制数据的工具类,包含大小端转换、byte[]数组转换为16进制的字符串、byte[]转ByteBuffer、16进制字符串转换为byte数组等

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

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

    字符串转16进制字节

    这里的`bytes.fromhex()`函数将16进制字符串转换为字节对象,`decode('utf-8')`再将字节解码回字符串。 除了Python,其他编程语言如Java、C++、JavaScript等也有类似的方法进行字符串与16进制字节的转换。在Java中...

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

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

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

    4. 将字符串转换为十六进制字符串:`public static String encodeHexStr(String str, Charset charset)` 该方法将字符串转换为十六进制字符串。该方法可以将字符串转换为小写或大写的十六进制字符串,可以根据需要...

    java二进制,字节数组,字符,十六进制,BCD编码转换

    /* java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */

Global site tag (gtag.js) - Google Analytics