1. 程式人生 > >怎麼用Integer.toHexString(int)得到byte型別的十六進位制字串形式?

怎麼用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 十進位制整數轉二進位制串 十進位制整數