怎麼用Integer.toHexString(int)得到byte型別的十六進位制字串形式?
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;
}
上面是將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的二進位制採用的是補碼形式
在這裡先溫習下計算機基礎理論
byte是一個位元組儲存的,有8個位,即8個0、1。
8位的第一個位是符號位,
也就是說0000 0001代表的是數字1
1000 0000代表的就是-1
所以正數最大位0111 1111,也就是數字127
負數最大為1111 1111,也就是數字-128
上面說的是二進位制原碼,但是在java中採用的是補碼的形式,下面介紹下什麼是補碼
1、反碼:
一個數如果是正,則它的反碼與原碼相同;
一個數如果是負,則符號位為1,其餘各位是對原碼取反;
2、補碼:利用溢位,我們可以將減法變成加法
對於十進位制數,從9得到5可用減法:
9-4=5 因為4+6=10,我們可以將6作為4的補數
改寫為加法:
9+6=15(去掉高位1,也就是減10)得到5.
對於十六進位制數,從c到5可用減法:
c-7=5 因為7+9=16 將9作為7的補數
改寫為加法:
c+9=15(去掉高位1,也就是減16)得到5.
在計算機中,如果我們用1個位元組表示一個數,一個位元組有8位,超過8位就進1,在記憶體中情況為(100000000),進位1被丟棄。
⑴一個數為正,則它的原碼、反碼、補碼相同
⑵一個數為負,剛符號位為1,其餘各位是對原碼取反,然後整個數加1
- 1的原碼為 10000001
- 1的反碼為 11111110
+ 1
- 1的補碼為 11111111
0的原碼為 00000000
0的反碼為 11111111(正零和負零的反碼相同)
+1
0的補碼為 100000000(舍掉打頭的1,正零和負零的補碼相同)
Integer.toHexString的引數是int,如果不進行&0xff,那麼當一個byte會轉換成int時,由於int是32位,而byte只有8位這時會進行補位,
例如補碼11111111的十進位制數為-1轉換為int時變為11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是這個數是不對的,這種補位就會造成誤差。
和0xff相與後,高24位元就會被清0了,結果就對了。
----
Java中的一個byte,其範圍是-128~127的,而Integer.toHexString的引數本來是int,如果不進行&0xff,那麼當一個byte會轉換成int時,對於負數,會做位擴充套件,舉例來說,一個byte的-1(即0xff),會被轉換成int的-1(即0xffffffff),那麼轉化出的結果就不是我們想要的了。
而0xff預設是整形,所以,一個byte跟0xff相與會先將那個byte轉化成整形運算,這樣,結果中的高的24個位元就總會被清0,於是結果總是我們想要的。
相關推薦
怎麼用Integer.toHexString(int)得到byte型別的十六進位制字串形式?
在剖析該問題前請看如下程式碼public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b.length; i++) { String hex = Integer.toHexStrin
java byte[]與十六進位制字串相互轉換
前言:我們經常在加密或者進行數字簽名的時候,需要將位元組陣列(byte[])與十六進位制表示的字串之間進行相互轉換。本篇文章介紹幾種將位元組陣列轉換為十六進位制字串的幾種方法,以及將十六進位制字串轉換為位元組陣列。 直接上程式碼,如下: pack
android byte位元組陣列轉換十六進位制字串(物聯網開發總結)
想起前段時間的物聯網的外包開發,經常遇到通過wifi接受的資料,要通過轉換成十六進位制字串,或者最後又是十進位制資料。都是根據雙方的協議來開發的。那麼我傳送過去的資料也需要,經過特殊轉換成byte位元組發過去,硬體那邊收到不至於亂碼的資料。 1、硬體除錯發給android這
byte[]陣列與十六進位制字串與字串的互相轉換(轉載)
1.請問c#中如何將十進位制數的字串轉化成十六進位制數的字串 //十進位制轉二進位制 Console.WriteLine("十進位制166的二進位制表示: "+Convert.ToString(166, 2)); //十進位制轉八進位制 Console.WriteLine("十進位制166的八進位制表示:
十六進位制字串轉byte陣列實現
字串轉byte陣列,就是實現如下功能:把一個字串,比如“E4F1C3A81F”每兩位作為一個十六進位制數存到一個unsigned char 型的陣列(buf)裡,buf[0] = 0xE4,buf[1
socket 傳送十六進位制的字串(十六進位制字串與其他型別的轉換)(轉)
socket 傳送十六進位制的字串 專案用到 socket tcp/ip 傳送/接受 十六進位制的字串,因為C# socket 傳送接受的都是byte[] (位元組陣列),現在記錄tyte[] 與各資料型別之間的轉換 注: C#的位元組陣列 byte[] 存放的時間是0-255的整型資料 byte 關鍵字
android byte位元組陣列轉換十六進位制字串
android讀到資料是byte位元組陣列,通過wifi接受的資料,要通過轉換成十六進位制字串,或者最後又是十進位制資料。都是根據雙方的協議來開發的。那麼我傳送過去的資料也需要,經過特殊轉換成byte位元組發過去,硬體那邊收到不至於亂碼的資料。 十六進位制字串是這樣的:
byte[]位元組陣列轉換為二、八、十、十六進位制字串
【前言】java中很多時候需要將byte[]轉為各種進位制的字串顯示,從2,8,10,16到比較高階的base64(編碼),至於什麼時候需要這樣,當你遇到這樣的問題就知道了。【程式碼】進位制轉換比較簡單,直接上程式碼,編碼轉換見其他文章。例如這個package com.uik
ios十進位制、十六進位制字串,byte,data等之間的轉換
十進位制->十六進位制 Byte bytes[]={0xA6,0x27,0x0A}; NSString *strIdL = [NSStringstringWithFormat:@"%@",[[NSStringalloc]initWithFormat:@"%
(學習筆記) Java byte[]轉二進位制字串,十六進位制字串的相互轉換
public class HexConver { public static void main(String[] args) { String content = "這是一個測試"; System.out.println("原字串:"+content);
將十六進位制字串轉為byte陣列
需求是這樣有十六進位制字串要存為byte陣列 如string st = "0A000000",轉為byte後為 byte[0]=10,byte[1]=0,byte[2]=0,byte[3]=0 因.net2.0可用Convert將十六進位制字串轉為byte有現成的就用吧
Java byte[] 位元組陣列 轉 二進位制 八進位制 十進位制 十六進位制字串
【前言】 java中很多時候需要將byte[]轉為各種進位制的字串顯示,從2,8,10,16到比較高階的base64(編碼), 至於什麼時候需要這樣,當你遇到這樣的問題就知道了。 【程式碼】 進位制轉換比較簡單,直接上程式碼,編碼轉換見其他文章。例如這個 package
十六進位制字串(CString或char[]) 和 BYTE,char陣列 相互轉化
CString CProgramInfoToolDlg::xByte2String(BYTE* bytes,int nArrSize) { static char hexDigits[] = { '0 ', '1 ', '2 ', '3 ', '4 ', '5 ', '6 ',
byte[]陣列與十六進位制字串與字串的互相轉換
字串轉換成十六進位制字串方法1: /** * 字串轉換成十六進位制字串 */ public static String str2HexStr(String str) { char[] chars = "0123456789ABCDEF".toChar
編制一個程式把BX暫存器內的二進位制數用十六進位制的形式在螢幕上顯示出來
大概流程是這樣子的: 程式碼: code segment assume cs:code start: mov bx,1234H sub ax,ax mov ch,4 rotate: mov cl,4 rol bx,cl mov al,bl and al
QT十進位制十六進位制字串轉換
QByteArray在串列埠通訊中經常被使用,有一定必要較為全面詳細的對QByteArray進行闡述。本文通過以下幾個部分加以介紹: 1. 初始化 2. 訪問與賦值 3. 新增、刪除、插入與替換操作 4. 查詢與比較 5. 資料轉換與處理 1 初始化 2 訪問與賦值
iOS 十六進位制字串 "#FFFF00" 轉換成顏色物件
1 + (UIColor *)colorWithHexStr:(NSString *)hexString { 2 NSString *colorString = [[hexString stringByReplacingOccurrencesOfString:@"#" withString:
nodejs十六進位制字串與btye型資料相互轉換
byte型轉換十六進位制字串 /** * byte型轉換十六進位制 * @param b * @returns {string} * @constructor */ const Bytes2HexString = (b)=> { let hexs = ""; fo
位元組陣列轉化為十六進位制字串時 &0xff
我是資源的搬運工~~~ 關於這個位元組陣列轉化為十六進位制字串時 &0xff,看到很多次了,這裡整理一下網上的資料,記錄一下: byte 為什麼要&0xff byte 為什麼要 &0xff /** * 位元組陣列轉換成字串HEX表示 *
二進位制字串,十進位制,十六進位制字串,ASC/GBK字串間的相互轉換函式
最近在做一些**演算法的處理,由於借鑑了許多已存在模組,處理時使用了許多字串和進位制轉換函式,過程中從下面幾個函式中得到許多幫助。 論壇參考連結: https://bbs.csdn.net/topics/390991981 十進位制整數轉二進位制串 十進位制整數