Java中byte与(16进制)字符串的互相转换

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

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

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

先说一下二进制补码:

左移是在后面补0
右移是在前面边补1或0,看最高位是0还是1,是0就补0,是1就补1.
左移始终是在右边补,不会产生符号问题,而右移会,所以要判断。

/**

Java代码      

  1. * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。
  2. * @param src byte[] data
  3. @return  hex string
  4. */
  5. public static String bytesToHexString(byte[] src){
  6. StringBuilder stringBuilder = new StringBuilder("");
  7. if (src == null || src.length <= 0) {
  8. return null;
  9. }
  10. for (int i = 0; i < src.length; i++) {
  11. int v = src[i] & 0xFF;
  12. String hv = Integer.toHexString(v);
  13. if (hv.length() < 2) {
  14. stringBuilder.append(0);
  15. }
  16. stringBuilder.append(hv);
  17. }
  18. return stringBuilder.toString();
  19. }
  20. /**
  21. * Convert hex string to byte[]
  22. * @param hexString the hex string
  23. * @return byte[]
  24. */
  25. public static byte[] hexStringToBytes(String hexString) {
  26. if (hexString == null || hexString.equals("")) {
  27. return null;
  28. }
  29. hexString = hexString.toUpperCase();
  30. int length = hexString.length() / 2;
  31. char[] hexChars = hexString.toCharArray();
  32. byte[] d = new byte[length];
  33. for (int i = 0; i < length; i++) {
  34. int pos = i * 2;
  35. d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
  36. }
  37. return d;
  38. }
  39. /**
  40. * Convert char to byte
  41. * @param c char
  42. * @return byte
  43. */
  44. private byte charToByte(char c) {
  45. return (byte) "0123456789ABCDEF".indexOf(c);
  46. }

Java代码      

  1. //将指定byte数组以16进制的形式打印到控制台
  2. public static void printHexString( byte[] b) {
  3. for (int i = 0; i < b.length; i++) {
  4. String hex = Integer.toHexString(b[i] & 0xFF);
  5. if (hex.length() == 1) {
  6. hex = ‘0‘ + hex;
  7. }
  8. System.out.print(hex.toUpperCase() );
  9. }
  10. }

java中byte转换int时为何与0xff进行与运算

在剖析该问题前请看如下代码

Java代码      

  1. public static String bytes2HexString(byte[] b) {
  2. String ret = "";
  3. for (int i = 0; i < b.length; i++) {
  4. String hex = Integer.toHexString(b[ i ] & 0xFF);
  5. if (hex.length() == 1) {
  6. hex = ‘0‘ + hex;
  7. }
  8. ret += hex.toUpperCase();
  9. }
  10. return ret;
  11. }

上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出 b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.
其原因在于: 1.byte的大小为8bits而int的大小为32bits 2.java的二进制采用的是补码(参考上面)形式。

其他方法

toHexString
public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。
如果参数为负,那么无符号整数值为参数加上 232;否则等于该参数。将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串。如果无符号数的大小值为零,则用一个零字符 ‘0‘ (‘\u0030‘) 表示它;否则,无符号数大小的表示形式中的第一个字符将不是零字符。用以下字符作为十六进制数字:
0123456789abcdef
这些字符的范围是从 ‘\u0030‘ 到 ‘\u0039‘ 和从 ‘\u0061‘ 到 ‘\u0066‘。如果希望得到大写字母,可以在结果上调用 String.toUpperCase() 方法:
Integer.toHexString(n).toUpperCase()
参数:
i - 要转换成字符串的整数。
返回:
用十六进制(基数 16)参数表示的无符号整数值的字符串表示形式。
// 转化字符串为十六进制编码
public static String toHexString(String s)
{
String str="";
for (int i=0;i<s.length();i++)
{
int ch = (int)s.charAt(i);
String s4 = Integer.toHexString(ch);
str = str + s4;
}
return str;
}
// 转化十六进制编码为字符串
public static String toStringHex(String s)
{
byte[] baKeyword = new byte[s.length()/2];
for(int i = 0; i < baKeyword.length; i++)
{
try
{
baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i*2, i*2+2),16));
}
catch(Exception e)
{
e.printStackTrace();
}
}
try
{
s = new String(baKeyword, "utf-8");//UTF-16le:Not
}
catch (Exception e1)
{
e1.printStackTrace();
}
return s;
}
// 转化十六进制编码为字符串
public static String toStringHex(String s)
{
byte[] baKeyword = new byte[s.length()/2];
for(int i = 0; i < baKeyword.length; i++)
{
try
{
baKeyword[i] = (byte)(0xff & Integer.parseInt(s.substring(i*2, i*2+2),16));
}
catch(Exception e)
{
e.printStackTrace();
}
}
try
{
s = new String(baKeyword, "utf-8");//UTF-16le:Not
}
catch (Exception e1)
{
e1.printStackTrace();
}
return s;
}
public static void main(String[] args) {
System.out.println(encode("中文"));
System.out.println(decode(encode("中文")));
}
/*
* 16进制数字字符集
*/
private static String hexString="0123456789ABCDEF";
/*
* 将字符串编码成16进制数字,适用于所有字符(包括中文)
*/
public static String encode(String str)
{
//根据默认编码获取字节数组
byte[] bytes=str.getBytes();
StringBuilder sb=new StringBuilder(bytes.length*2);
//将字节数组中每个字节拆解成2位16进制整数
for(int i=0;i<bytes.length;i++)
{
sb.append(hexString.charAt((bytes[i]&0xf0)>>4));
sb.append(hexString.charAt((bytes[i]&0x0f)>>0));
}
return sb.toString();
}
/*
* 将16进制数字解码成字符串,适用于所有字符(包括中文)
*/
public static String decode(String bytes)
{
ByteArrayOutputStream baos=new ByteArrayOutputStream(bytes.length()/2);
//将每2位16进制整数组装成一个字节
for(int i=0;i<bytes.length();i+=2)
baos.write((hexString.indexOf(bytes.charAt(i))<<4 |hexString.indexOf(bytes.charAt(i+1))));
return new String(baos.toByteArray());
}

第二种方法: 将指定byte数组以16进制的形式打印到控制台

package com.nantian.iclient.atm.sdb;

public class Util {

public Util() {

}

/**

* 将指定byte数组以16进制的形式打印到控制台

* @param hint String

* @param b byte[]

* @return void

*/

public static void printHexString(String hint, byte[] b) {

System.out.print(hint);

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() + " ");

}

System.out.println("");

}

/**

*

* @param b byte[]

* @return String

*/

public static String Bytes2HexString(byte[] b) {

String ret = "";

for (int i = 0; i < b.length; i++) {

String hex = Integer.toHexString(b[i] & 0xFF);

if (hex.length() == 1) {

hex = ‘0‘ + hex;

}

ret += hex.toUpperCase();

}

return ret;

}

/**

* 将两个ASCII字符合成一个字节;

* 如:"EF"--> 0xEF

* @param src0 byte

* @param src1 byte

* @return byte

*/

public static byte uniteBytes(byte src0, byte src1) {

byte _b0 = Byte.decode("0x" + new String(new byte[]{src0})).byteValue();

_b0 = (byte)(_b0 << 4);

byte _b1 = Byte.decode("0x" + new String(new byte[]{src1})).byteValue();

byte ret = (byte)(_b0 ^ _b1);

return ret;

}

/**

* 将指定字符串src,以每两个字符分割转换为16进制形式

* 如:"2B44EFD9" --> byte[]{0x2B, 0x44, 0xEF, 0xD9}

* @param src String

* @return byte[]

*/

public static byte[] HexString2Bytes(String src){

byte[] ret = new byte[8];

byte[] tmp = src.getBytes();

for(int i=0; i<8; i++){

ret[i] = uniteBytes(tmp[i*2], tmp[i*2+1]);

}

return ret;

}

}

时间: 2024-10-10 05:22:17

Java中byte与(16进制)字符串的互相转换的相关文章

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

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,原理同上. 根据以上原理,我们就可

Java中byte与16进制字符串的互相转换(转)

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,原理同上. 根据以上原理,我们就可

java中byte[] 和16进制字符串互转

//将byte[]转换为16进制字符串 public static String byte2hex(byte[] b) { StringBuilder hs = new StringBuilder(); String stmp; for (int n = 0; b != null && n < b.length; n++) { stmp = Integer.toHexString(b[n] & 0XFF); if (stmp.length() == 1) hs.append(

Java字节数组和16进制字符串的互相转化

背景基础知识: 1.字符编码的相关知识(转自http://blog.csdn.net/llwan/article/details/7567906) 1.1. "字符"是由数字来表示的 先来重新了解一下计算机是如何处理"字符"的,这个原理是大家必须记住的,特别是在用JAVA写程序的时候,万万不可模糊.我们知道,计算机把任何东西都用数字来表示,"字符"也不例外.比如我们要显示一个阿拉伯数字"3",在我们的PC里,其实并不是仅仅用一

C#字符串和16进制字符串之间的转换

将字符串编码成 16进制 字符串表示: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Net; namespace ConsoleApplication1{ class Program { static void Main(string[] args) { // 将字符串转换成16进制表示: // 先将字符串转换成 byte 数组: // (1).如果是

C#数字、16进制字符串和字节之间互转

转自http://luohonghong.blog.163.com/blog/static/78312058201242632055642/ 如下: 1.数字和字节之间互转 int num=12345; byte[] bytes=BitConverter.GetBytes(num);//将int32转换为字节数组 num=BitConverter.ToInt32(bytes,0);//将字节数组内容再转成int32类型 2.将字符串转为16进制字符,允许中文 private string Str

java中如何将byte[]里面的数据转换成16进制字符串

原文链接: http://zhidao.baidu.com/link?url=RmLDjr4PtP_oUE5J2pKNZSvlHt1K7HcCh4-03Y7VkXYhJ0kawg01CtKHZc2uBVxQsHgzl8pp60WBYULP6K15K_ 以下3个方法能将byte[]转化成16进制字符串,可以任选一个 /* * * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int) *来转换成16进制

Java 将字节转化为16进制字符串

很多时候我们需要将字节数组转化为16进制字符串来保存,例如做I/O字节流操作的时候,尤其在很多加密的场景中应用都比较广泛. Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示,所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16进制字符H和L,并组合起来得到byte 转换到16进制字符串的结果new String(H) + new String(L).即byte用十六进制表示只占2位. 从上面可以看出

C# byte[] 转换16进制字符串

1.byte[] 转换16进制字符串 1.1 BitConverter方式 1 var str = DateTime.Now.ToString(); 2 var encode = Encoding.UTF8; 3 var bytes = encode.GetBytes(str); 4 var hex = BitConverter.ToString(bytes, 0).Replace("-", string.Empty).ToLower(); 5 Console.WriteLine(he

byte[]数组与16进制字符串的相互转换

1.将byte[]数组转换成16进制字符 /** * 将byte[]数组转换成16进制字符.一个byte生成两个字符,长度对应1:2 * @param bytes,输入byte[]数组 * @return 16进制字符 */ public static String byte2Hex(byte[] bytes) { if (bytes == null) { return null; } StringBuilder builder = new StringBuilder(); // 遍历byte[