java中進(jìn)制的轉(zhuǎn)換,Byte與16進(jìn)制的轉(zhuǎn)換方法
java中對(duì)于進(jìn)制的轉(zhuǎn)換有很多方式,其中對(duì)于常見的基本的二進(jìn)制 八進(jìn)制 十進(jìn)制 十六進(jìn)制等的轉(zhuǎn)換有對(duì)于的包裝類實(shí)現(xiàn),不需要通過(guò)二外的算法來(lái)進(jìn)行實(shí)現(xiàn),具體如下:
首先關(guān)于最簡(jiǎn)單的二進(jìn)制轉(zhuǎn)換的方法有:
十進(jìn)制轉(zhuǎn)成十六進(jìn)制:
String Integer.toHexString(int i)
十進(jìn)制轉(zhuǎn)成八進(jìn)制
String Integer.toOctalString(int i)
十進(jìn)制轉(zhuǎn)成二進(jìn)制
String Integer.toBinaryString(int i)
十六進(jìn)制轉(zhuǎn)成十進(jìn)制
Integer.valueOf("FFFF",16).toString() //不能處理帶前綴的情況 0x
八進(jìn)制轉(zhuǎn)成十進(jìn)制
Integer.valueOf("76",8).toString() //前綴0可以被處理
二進(jìn)制轉(zhuǎn)十進(jìn)制
Integer.valueOf("0101",2).toString()
有什么方法可以直接將2,8,16 進(jìn)制直接轉(zhuǎn)換為10進(jìn)制的嗎 ?
java.lang.Integer類
parseInt(String s, int radix)
使用第二個(gè)參數(shù)指定的基數(shù),將字符串參數(shù)解析為有符號(hào)的整數(shù)。
examples from jdk:
parseInt("0", 10) returns 0
parseInt("473", 10) returns 473
parseInt("-0", 10) returns 0
parseInt("-FF", 16) returns -255
parseInt("1100110", 2) returns 102
parseInt("2147483647", 10) returns 2147483647
parseInt("-2147483648", 10) returns -2147483648
parseInt("2147483648", 10)throwsa NumberFormatException
parseInt("99",throwsa NumberFormatException
parseInt("Kona", 10)throwsa NumberFormatException
parseInt("Kona", 27)returns 411787
進(jìn)制轉(zhuǎn)換如何寫(二,八,十六)不用算法
Integer.toBinaryString
Integer.toOctalString
Integer.toHexString
然后是介紹java中的byte與十六進(jìn)制數(shù)的轉(zhuǎn)換
原理分析:
Java中的byte是由8個(gè)bit組成的,而16進(jìn)制即16中狀態(tài),它是由4個(gè)bit來(lái)表示的,因?yàn)?4=16。所以我們可以把一個(gè)byte轉(zhuǎn)換成兩個(gè)用16進(jìn)制字符,即把高4位和低4位轉(zhuǎn)換成相應(yīng)的16進(jìn)制字符,并組合這兩個(gè)16進(jìn)制字符串,從而得到byte的16進(jìn)制字符串。同理,相反的轉(zhuǎn)換也是將兩個(gè)16進(jìn)制字符轉(zhuǎn)換成一個(gè)byte。
在Java中字節(jié)與十六進(jìn)制的相互轉(zhuǎn)換主要思想有兩點(diǎn):
1、二進(jìn)制字節(jié)轉(zhuǎn)十六進(jìn)制時(shí),將字節(jié)高位與0xF0做"&"操作,然后再左移4位,得到字節(jié)高位的十六進(jìn)制A;將字節(jié)低位與0x0F做"&"操作,得到低位的十六進(jìn)制B,將兩個(gè)十六進(jìn)制數(shù)拼裝到一塊AB就是該字節(jié)的十六進(jìn)制表示。
2、十六進(jìn)制轉(zhuǎn)二進(jìn)制字節(jié)時(shí),將十六進(jìn)制字符對(duì)應(yīng)的十進(jìn)制數(shù)字右移動(dòng)4為,得到字節(jié)高位A;將字節(jié)低位的十六進(jìn)制字符對(duì)應(yīng)的十進(jìn)制數(shù)字B與A做"|"運(yùn)算,即可得到十六進(jìn)制的二進(jìn)制字節(jié)表示
其中一種轉(zhuǎn)換的函數(shù)如下:
/** * * @param bytes * @return 將二進(jìn)制轉(zhuǎn)換為十六進(jìn)制字符輸出 */ </span> private static String hexStr = "0123456789ABCDEF"; //全局 public static String BinaryToHexString(byte[] bytes){ String result = ""; String hex = ""; for(int i=0;i<bytes.length;i++){ //字節(jié)高4位 <strong>hex = String.valueOf(hexStr.charAt((bytes[i]&0xF0)>>4)); </strong> //字節(jié)低4位 <strong>hex += String.valueOf(hexStr.charAt(bytes[i]&0x0F)); </strong> result +=hex; } return result; } /** * * @param hexString * @return 將十六進(jìn)制轉(zhuǎn)換為字節(jié)數(shù)組 */ public static byte[] HexStringToBinary(String hexString){ //hexString的長(zhǎng)度對(duì)2取整,作為bytes的長(zhǎng)度 int len = hexString.length()/2; byte[] bytes = new byte[len]; byte high = 0;//字節(jié)高四位 byte low = 0;//字節(jié)低四位 for(int i=0;i<len;i++){ //右移四位得到高位 high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4); low = (byte)hexStr.indexOf(hexString.charAt(2*i+1)); bytes[i] = (byte) (high|low);//高地位做或運(yùn)算 } return bytes; } }
還有一種類似的方法:
<span style="font-size:14px;">* Convert byte[] to hex string.這里我們可以將byte轉(zhuǎn)換成int,然后利用Integer.toHexString(int)來(lái)轉(zhuǎn)換成16進(jìn)制字符串。
* @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; } /** * Convert char to byte * @param c char * @return byte */ private byte charToByte(char c) { return (byte) "0123456789ABCDEF".indexOf(c); } </span>
兩種方式類似,這里注意下
上面是將byte[]轉(zhuǎn)化十六進(jìn)制的字符串,注意這里b[ i ] & 0xFF將一個(gè)byte和 0xFF進(jìn)行了與運(yùn)算,然后使用Integer.toHexString取得了十六進(jìn)制字符串,可以看出
b[ i ] & 0xFF運(yùn)算后得出的仍然是個(gè)int,那么為何要和 0xFF進(jìn)行與運(yùn)算呢?直接 Integer.toHexString(b[ i ]);,將byte強(qiáng)轉(zhuǎn)為int不行嗎?答案是不行的.
其原因在于:
1.byte的大小為8bits而int的大小為32bits
2.java的二進(jìn)制采用的是補(bǔ)碼形式
所以與負(fù)數(shù)&的時(shí)候負(fù)數(shù)會(huì)自動(dòng)給補(bǔ)碼補(bǔ)位1,這樣就會(huì)有誤差
而0xff默認(rèn)是整形,所以,一個(gè)byte跟0xff相與會(huì)先將那個(gè)byte轉(zhuǎn)化成整形運(yùn)算,這樣,結(jié)果中的高的24個(gè)比特就總會(huì)被清0,于是結(jié)果總是我們想要的。
還有一些網(wǎng)上總結(jié)的方法:
字符串轉(zhuǎn)換成十六進(jìn)制字符串方法1:
/** * 字符串轉(zhuǎn)換成十六進(jìn)制字符串 */ public static String str2HexStr(String str) { char[] chars = "0123456789ABCDEF".toCharArray(); StringBuilder sb = new StringBuilder(""); byte[] bs = str.getBytes(); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append(chars[bit]); bit = bs[i] & 0x0f; sb.append(chars[bit]); } return sb.toString(); }
十六進(jìn)制字符串轉(zhuǎn)換成為數(shù)組方法1:
/** * 把16進(jìn)制字符串轉(zhuǎn)換成字節(jié)數(shù)組 * @param hexString * @return byte[] */ public static byte[] hexStringToByte(String hex) { int len = (hex.length() / 2); byte[] result = new byte[len]; char[] achar = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); } return result; } private static int toByte(char c) { byte b = (byte) "0123456789ABCDEF".indexOf(c); return b; }
數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串方法1:
/** * 數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串 * @param byte[] * @return HexString */ public static final String bytesToHexString(byte[] bArray) { StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i = 0; i < bArray.length; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); }
byte[]數(shù)組轉(zhuǎn)換成十六進(jìn)制字符串方法2:
/** * 數(shù)組轉(zhuǎn)成十六進(jìn)制字符串 * @param byte[] * @return HexString */ public static String toHexString1(byte[] b){ StringBuffer buffer = new StringBuffer(); for (int i = 0; i < b.length; ++i){ buffer.append(toHexString1(b[i])); } return buffer.toString(); } public static String toHexString1(byte b){ String s = Integer.toHexString(b & 0xFF); if (s.length() == 1){ return "0" + s; }else{ return s; } }
十六進(jìn)制字符串轉(zhuǎn)換字符串方法1:
/** * 十六進(jìn)制字符串轉(zhuǎn)換成字符串 * @param hexString * @return String */ public static String hexStr2Str(String hexStr) { String str = "0123456789ABCDEF"; char[] hexs = hexStr.toCharArray(); byte[] bytes = new byte[hexStr.length() / 2]; int n; for (int i = 0; i < bytes.length; i++) { n = str.indexOf(hexs[2 * i]) * 16; n += str.indexOf(hexs[2 * i + 1]); bytes[i] = (byte) (n & 0xff); } return new String(bytes); }
十六進(jìn)制字符串轉(zhuǎn)換字符串方法2:
/** * 十六進(jìn)制字符串轉(zhuǎn)換字符串 * @param HexString * @return String */ 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; }
以上這篇java中進(jìn)制的轉(zhuǎn)換,Byte與16進(jìn)制的轉(zhuǎn)換方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
淺析springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控
Zipkin是一款開源的分布式實(shí)時(shí)數(shù)據(jù)追蹤系統(tǒng)(Distributed Tracking System),其主要功能是聚集來(lái)自各個(gè)異構(gòu)系統(tǒng)的實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)。這篇文章主要介紹了springcloud 整合 zipkin-server 內(nèi)存日志監(jiān)控,需要的朋友可以參考下2019-11-11IntelliJ IDEA 下載安裝超詳細(xì)教程(推薦)
這篇文章主要介紹了IntelliJ IDEA 下載安裝超詳細(xì)教程(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用
這篇文章主要介紹了關(guān)于SpringMVC中數(shù)據(jù)綁定@ModelAttribute注解的使用,SpringMVC是一個(gè)基于Spring框架的Web框架,它提供了一種簡(jiǎn)單、靈活的方式來(lái)開發(fā)Web應(yīng)用程序,在開發(fā)Web應(yīng)用程序時(shí),我們需要將用戶提交的數(shù)據(jù)綁定到我們的Java對(duì)象上,需要的朋友可以參考下2023-07-07Java基礎(chǔ)知識(shí)之I/O流和File類文件操作
眾所周知java語(yǔ)言提供給程序員非常多的包供編程時(shí)使用,方便又快捷,下面這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)知識(shí)之I/O流和File類文件操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04Java?C++題解leetcode769最多能完成排序的塊
這篇文章主要為大家介紹了Java?C++題解leetcode769最多能完成排序的塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Springboot整合Shiro實(shí)現(xiàn)登錄與權(quán)限校驗(yàn)詳細(xì)解讀
本文給大家介紹Springboot整合Shiro的基本使用,Apache?Shiro是Java的一個(gè)安全框架,Shiro本身無(wú)法知道所持有令牌的用戶是否合法,我們將整合Shiro實(shí)現(xiàn)登錄與權(quán)限的驗(yàn)證2022-04-04springIOC的使用流程及spring中使用類型轉(zhuǎn)換器的方式
Spring IOC是Spring框架的核心原理之一,它是一種軟件設(shè)計(jì)模式,用于管理應(yīng)用程序中的對(duì)象依賴關(guān)系,這篇文章主要介紹了springIOC的使用流程以及spring中如何使用類型轉(zhuǎn)換器,需要的朋友可以參考下2023-06-06