程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中字符串與byte數組之間的互相轉換

Java中字符串與byte數組之間的互相轉換

編輯:關於JAVA

Java中字符串與byte數組之間的互相轉換。本站提示廣大學習愛好者:(Java中字符串與byte數組之間的互相轉換)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中字符串與byte數組之間的互相轉換正文


媒介

Java與其他說話編寫的法式停止tcp/ip socket通信時,通信內容普通都轉換成byte數組型,java在字符與數組轉換也長短常便利的。上面跟我一路來懂得一下字符串與byte之間轉換的道理

道理

我們都曉得,在Java裡byte類型是占用1個字節,即8位的,而16進制的字符占用4位,所以每一個byte可以用兩個字符來表現,反之亦然。

舉個例子

byte = 123

用二進制表現:0111 1011

每4位用字符表現: 7 b

是的,道理就這麼簡略,接上去用代碼完成:

byte[] 轉16進制字符串

辦法一

思緒:先把byte[] 轉換維char[] ,再把char[] 轉換為字符串

 public static String bytes2Hex(byte[] src) {
  if (src == null || src.length <= 0) { 
   return null; 
  } 

  char[] res = new char[src.length * 2]; // 每一個byte對應兩個字符
  final char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  for (int i = 0, j = 0; i < src.length; i++) {
   res[j++] = hexDigits[src[i] >> 4 & 0x0f]; // 先存byte的高4位
   res[j++] = hexDigits[src[i] & 0x0f]; // 再存byte的低4位
  }

  return new String(res);
 }

辦法二

思緒:先把byte轉換為int類型,再轉換為字符串

 public static String bytesToHex(byte[] src){ 
  if (src == null || src.length <= 0) { 
   return null; 
  } 

  StringBuilder stringBuilder = new StringBuilder("");   
  for (int i = 0; i < src.length; i++) { 
   // 之所以用byte和0xff相與,是由於int是32位,與0xff相與後就捨棄後面的24位,只保存後8位
   String str = Integer.toHexString(src[i] & 0xff); 
   if (str.length() < 2) { // 缺乏兩位要補0
    stringBuilder.append(0); 
   } 
   stringBuilder.append(str); 
  } 
  return stringBuilder.toString(); 
 }

16進制字符串轉byte[]

思緒:先把字符串轉換為char[] ,再轉換為byte[]

 public static byte[] hexToBytes(String hexString) { 
  if (hexString == null || hexString.equals("")) { 
   return null; 
  } 

  int length = hexString.length() / 2; 
  char[] hexChars = hexString.toCharArray(); 
  byte[] bytes = new byte[length]; 
  String hexDigits = "0123456789abcdef";
  for (int i = 0; i < length; i++) { 
   int pos = i * 2; // 兩個字符對應一個byte
   int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1
   int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2
   if(h == -1 || l == -1) { // 非16進制字符
    return null;
   }
   bytes[i] = (byte) (h | l); 
  } 
  return bytes; 
 }

注:注1獲得xxxx0000,注2獲得0000xxxx,相或就把兩個字符轉換為一個byte了。

再舉個例子

md5加密

 public static String getMd5ByFile(File file) {
  String ret= null;
  FileInputStream fis = null;
  try {
   fis = new FileInputStream(file);
   MessageDigest md = MessageDigest.getInstance("MD5");
   byte[] buffer = new byte[1024];
   int len;
   while((len = fis.read(buffer)) > 0) {
    md.update(buffer, 0, len);
   }
   ret = bytes2Hex(md.digest()); // 把md5加密後的byte[]轉換為字符串
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if(fis != null) {
    try {
     fis.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }

  return ret;
 }

總結

好了,應當懂了吧,其實其實不難的。以上就是這篇文章的全體內容了,願望這篇文章的內容對年夜家的進修或許任務能帶來必定的贊助,假如有疑問年夜家可以留言交換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved