一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換

Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換

2020-06-20 12:40LeoExer JAVA教程

Java語(yǔ)言中字符串類型和字節(jié)數(shù)組類型相互之間的轉(zhuǎn)換經(jīng)常發(fā)生,網(wǎng)上的分析及代碼也比較多,這篇文章將主要介紹Java中字符串與byte數(shù)組之間的相互轉(zhuǎn)換,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。

前言

Java與其他語(yǔ)言編寫的程序進(jìn)行tcp/ip socket通訊時(shí),通訊內(nèi)容一般都轉(zhuǎn)換成byte數(shù)組型,java在字符與數(shù)組轉(zhuǎn)換也是非常方便的。下面跟我一起來(lái)了解一下字符串byte之間轉(zhuǎn)換的原理

原理

我們都知道,在Java里byte類型是占用1個(gè)字節(jié),即8位的,而16進(jìn)制的字符占用4位,所以每個(gè)byte可以用兩個(gè)字符來(lái)表示,反之亦然。

舉個(gè)例子

?
1
byte = 123

用二進(jìn)制表示:0111 1011

每4位用字符表示: 7 b

是的,原理就這么簡(jiǎn)單,接下來(lái)用代碼實(shí)現(xiàn):

byte[] 轉(zhuǎn)16進(jìn)制字符串

方法一

思路:先把byte[] 轉(zhuǎn)換維char[] ,再把char[] 轉(zhuǎn)換為字符串

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static String bytes2Hex(byte[] src) {
 if (src == null || src.length <= 0) {
  return null;
 }
 
 char[] res = new char[src.length * 2]; // 每個(gè)byte對(duì)應(yīng)兩個(gè)字符
 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轉(zhuǎn)換為int類型,再轉(zhuǎn)換為字符串

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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相與,是因?yàn)閕nt是32位,與0xff相與后就舍棄前面的24位,只保留后8位
  String str = Integer.toHexString(src[i] & 0xff);
  if (str.length() < 2) { // 不足兩位要補(bǔ)0
   stringBuilder.append(0);
  }
  stringBuilder.append(str);
 }
 return stringBuilder.toString();
}

16進(jìn)制字符串轉(zhuǎn)byte[]

思路:先把字符串轉(zhuǎn)換為char[] ,再轉(zhuǎn)換為byte[]

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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; // 兩個(gè)字符對(duì)應(yīng)一個(gè)byte
  int h = hexDigits.indexOf(hexChars[pos]) << 4; // 注1
  int l = hexDigits.indexOf(hexChars[pos + 1]); // 注2
  if(h == -1 || l == -1) { // 非16進(jìn)制字符
   return null;
  }
  bytes[i] = (byte) (h | l);
 }
 return bytes;
}

注:注1得到xxxx0000,注2得到0000xxxx,相或就把兩個(gè)字符轉(zhuǎn)換為一個(gè)byte了。

再舉個(gè)例子

md5加密

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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[]轉(zhuǎn)換為字符串
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  if(fis != null) {
   try {
    fis.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 return ret;
}

總結(jié)

好了,應(yīng)該懂了吧,其實(shí)并不難的。以上就是這篇文章的全部?jī)?nèi)容了,希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女秘密网站 | 探花国产 | 精品午夜视频 | 国产精品色图 | 国产一区二区三区免费在线视频 | 亚洲精品在看在线观看 | 禁漫H天堂免费A漫 | 天天做天天爱天天综合网 | 99re5在线精品视频热线 | 变态人shou交小说 | 亚洲色欲色欲综合网站 | 天天干天天日天天射天天操毛片 | 韩国伦理hd | 红楼影视h38bar在线线播放 | 性bbbbwwbbbb| 男人捅女人漫画 | 欧美精品久久久久久久影视 | 欧美添下面视频免费观看 | 午夜福利电影网站鲁片大全 | 久久综合香蕉久久久久久久 | 麻豆视频网 | 欧美a级v片不卡在线观看 | 国产视频在线一区 | 万域之王动漫在线观看全集免费播放 | 2018亚洲男人天堂 | 草莓香蕉绿巨人丝瓜榴莲18 | 日本黄色大片免费观看 | 亚洲成在人网站天堂一区二区 | 亚洲男女网站 | 亚洲日韩中文字幕一区 | 91狠狠| 天堂在线中文字幕 | 国产一级片在线 | 小辣椒精品福利视频导航 | 亚洲一区 在线播放 | 垫底辣妹免费观看完整版 | 狠狠干在线观看 | 国产亚洲视频网站 | 欧美一级高清片免费一级 | 精品国产mmd在线观看 | 亚洲性视频在线观看 |