`

byteArray <==> Hex

    博客分类:
  • JAVA
阅读更多

 一些算法摘录自:

http://stackoverflow.com/questions/332079/in-java-how-do-i-convert-a-byte-array-to-a-string-of-hex-digits-while-keeping-le

 

http://rgagnon.com/javadetails/java-0596.html

 

http://stackoverflow.com/questions/140131/convert-a-string-representation-of-a-hex-dump-to-a-byte-array-using-java

 

 发现经常需要使用这个函数,故放在blog上用于以后查看

 

  一:字节数组转换到16进制形式的字符串

   1:利用Integer的toHexString

 /**
     * 字节数组转换成十六进制字符串
     *
     * @param b 字节数组
     *
     * @return 十六进制字符串
     */
    public static final String byte2hex(byte[] b) {
        String hs   = "";
        String stmp = "";

        for (int i = 0; i < b.length; i++) {
            stmp = Integer.toHexString(b[i] & 0xFF);

            if (stmp.length() == 1) {
                hs += "0" + stmp;
            } else {
                hs += stmp;
            }
        }

        return hs.toUpperCase();
    }

 

  2:利用BigInteger 和String.format

 

public static String toHex(byte[] bytes) {
	    BigInteger bi = new BigInteger(1, bytes);
	    return String.format("%0" + (bytes.length << 1) + "X", bi);
}
 

  3:利用BigInteger

 

public static String toHex(byte[] bytes) {
		BigInteger bi = new BigInteger(1, bytes);
	    String result = bi.toString(16);
	    if (result.length() % 2 != 0) {
	        return "0" + result;
	    }
	    return result.toUpperCase();

}

 

 4.1: & 神奇的数

 

public static String toHex(byte[] b) throws Exception {
		  String result = "";
		  for (int i=0; i < b.length; i++) {
		    result +=
		          Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
		  }
		  return result.toUpperCase();
}

 

4.2 : + 神奇的数 (和上一个有关)

 

public static String toHex(byte[]bytes) {
	    StringBuilder sb = new StringBuilder(bytes.length*2);
	    for(byte b: bytes)
	      sb.append(Integer.toHexString(b+0x800).substring(1));
	    return sb.toString().toUpperCase();
}
 

 

5.1:映射表 移位 &

public static String toHex( byte [] raw ) {
	 String HEXES = "0123456789ABCDEF";
	    if ( raw == null ) {
	      return null;
	    }
	    final StringBuilder hex = new StringBuilder( 2 * raw.length );
	    for ( final byte b : raw ) {
	      hex.append(HEXES.charAt((b & 0xF0) >> 4))
	         .append(HEXES.charAt((b & 0x0F)));
	    }
	    return hex.toString();
}

5.1 :映射表 除法 取模

public static String toHex(byte[] bytes) {
	    char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	    char[] hexChars = new char[bytes.length * 2];
	    int v;
	    for ( int j = 0; j < bytes.length; j++ ) {
	        v = bytes[j] & 0xFF;
	        hexChars[j*2] = hexArray[v/16];
	        hexChars[j*2 + 1] = hexArray[v%16];
	    }
	    return new String(hexChars);
}
 

 

6:String.format

 

static String toHex(byte[] digest) {
	    StringBuilder sb = new StringBuilder();
	    for (byte b : digest) {
	        sb.append(String.format("%1$02X", b));
	    }

	    return sb.toString();
}
 

 

   二:十六进制字符串转为字节数组,上一个的逆过程

  /**
     * 十六进制字符串转换成字节数组
     *
     * @param hex 十六进制字符串
     *
     * @return 字节数组
     *
     * @throws IllegalArgumentException
     */
    public static final byte[] hex2byte(String hex) throws IllegalArgumentException {
        if (hex.length() % 2 != 0) {
            throw new IllegalArgumentException();
        }

        char[] arr = hex.toCharArray();
        byte[] b = new byte[hex.length() / 2];

        for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) {
            String swap    = "" + arr[i++] + arr[i];
            int    byteint = Integer.parseInt(swap, 16) & 0xFF;

            b[j] = new Integer(byteint).byteValue();
        }

        return b;
    }

 

 新发现,其实JAVA中有提供这一函数,还可以偷窥其实现

 

 javax.xml.bind.annotation.adapters.HexBinaryAdapter;

  public byte[] unmarshal(String s) {
        if(s==null)     return null;
        return DatatypeConverter.parseHexBinary(s);
  }

  public String marshal(byte[] bytes) {
        if(bytes==null)     return null;
        return DatatypeConverter.printHexBinary(bytes);
  }
 

 

其实很早以前看到一个实现更加简便的,但是忘了是什么了,有同学发现了告诉我下。

分享到:
评论

相关推荐

    Java中byte[]、String、Hex字符串等转换的方法

    if (hexString.length() &lt; 2) { hexString = '0' + hexString; } ``` 这个方法将一个10进制数字字符串转换成Hex字符串。 byte[]到Hex字符串的转换 byte[]可以被转换成Hex字符串。下面是一个示例代码: ```java ...

    MD5加密测试_java类

    byte[] byteArray = new byte[charArray.length]; for (int i = 0; i &lt; charArray.length; i++) byteArray[i] = (byte) charArray[i]; byte[] md5Byte = this.mad5.digest(byteArray); StringBuffer hex...

    C# string byte数组转换解析.pdf

    i &lt; hexString.Length; i++) { c = hexString[i]; if (IsHexDigit(c)) newString += c; else discarded++; } if (newString.Length % 2 != 0) { discarded++; newString = newString.Substring(0, new...

    vb16进制与ASCII码转换

    - 首先,我们需要将16进制字符串转换为整数,可以使用`Val("&H" & hexStr)`,这里的`hexStr`是16进制字符串。然后,使用`ChrW()`函数将这个整数转换为对应的Unicode字符。例如: ```vb Dim hexStr As String hex...

    Qt 读取16进制的data文件

    qDebug() &lt;&lt; hexStr; } ``` 这段代码首先打开文件,然后创建一个`QDataStream`实例来读取文件内容。我们设置字节顺序,通常是小端序(LittleEndian),因为大多数现代计算机系统使用这种字节序。接着,我们逐字节...

    bintohex.rar

    在Python中,二进制数据通常以字节(bytes)或字节数组(bytearray)的形式存在。`bin()`函数可以将整数转换为二进制字符串,而`hex()`函数则可以将整数转换为小写的十六进制字符串。如果要处理字节对象,可以使用内...

    Python hexstring-list-str之间的转换方法

    byte_array = bytearray.fromhex(hex_string) # 转换为列表 hex_list = list(byte_array) print(hex_list) # 输出结果:[83, 33, 106] ``` ##### 5. hexstring转换为str 将`'53216A'`转换为`'\x53\x21\x6a'`。 *...

    C#_string_byte数组转换解析

    i &lt; hexString.Length; i++) { c = hexString[i]; if (IsHexDigit(c)) newString += c; else discarded++; } // if odd number of characters, discard last character if (newString.Length % 2 != 0) {...

    完整详细版Python全套教学课件 第02节 内置数据结构04 bytes和bytearray.pptx

    此外,`bytes`还有类方法`fromhex()`,用于将16进制字符串转换为`bytes`对象。 `bytearray`则是一个可变的字节数组,它可以像列表一样进行增删改操作。它的初始化方法与`bytes`类似,只是在最后多了一个可选的`...

    XE5 ClientSocket客户端接收与发送信息(十六进制)

    ByteArray := HexToBin(HexString); // 发送字节数组 ClientSocket.Socket.WriteBuffer(Pointer(ByteArray)^, Length(ByteArray)); end; ``` 四、接收十六进制数据 ClientSocket提供了`OnDataAvailable`事件来...

    对Python3中bytes和HexStr之间的转换详解

    1. 使用 `bytearray.fromhex()` 将十六进制字符串转换为 `bytearray`。 2. 将 `bytearray` 转换为列表。 ```python x = '53216A' y = bytearray.fromhex(x) z = list(y) print(z) # 输出: [83, 33, 106] ``` #####...

    C# string byte数组转换解析.docx

    i &lt; hexString.Length; i += 2) { byte highNibble = HexCharToByte(hexString[i]); byte lowNibble = HexCharToByte(hexString[i + 1]); result[i / 2] = (byte)(highNibble &lt;&lt; 4 | lowNibble); } return ...

    MD5、AES、DES加密的java实现

    if (val &lt; 16) { hexValue.append("0"); } hexValue.append(Integer.toHexString(val)); } return hexValue.toString(); } catch (NoSuchAlgorithmException e) { System.out.println(e.toString()); e....

    通讯.zipRS232通讯 字符串输入和16进制输入

    BYTE byteToSend = static_cast&lt;BYTE&gt;(hexValue); m_SerialPort.Write(&byteToSend, 1); ``` **处理数据接收** 在MFC中,通常使用CSerialPort类的OnReceive()事件处理函数来接收数据。收到的数据可能是字节流,需要...

    vb md5加密源程序

    Dim byteArray As Byte() = System.Text.Encoding.ASCII.GetBytes(data) ``` 注意,这里我们假设字符串是ASCII编码的,如果原始数据是Unicode或其他编码,应使用相应的Encoding对象。 3. **计算哈希值**:调用MD5...

    汉字转16进制和16进制转汉字

    byte_arr = bytearray(bytes_seq) hanzi_recovered = byte_arr.decode('GBK') print(hanzi_recovered) # 输出:汉字 ``` 2. 处理多字节字符:在UTF-8编码下,由于汉字可能由多个字节表示,16进制字符串的长度会...

    MD5算法java篇

    byte[] byteArray = new byte[charArray.length]; for (int i = 0; i &lt; charArray.length; i++) { byteArray[i] = (byte) charArray[i]; } ``` 将输入字符串转换为字节数组,以便进行加密处理。 - **执行MD5...

    例18-6 十六进制数据的发送_十六进制数据的发送_

    return ''.join(f'{n:02X}' for n in bytearray.fromhex(hex_data)) def send_hex_data(port, hex_data): ascii_data = hex_to_ascii(hex_data) for char in ascii_data: port.write(chr(ord(char))) # 假设...

Global site tag (gtag.js) - Google Analytics