byte轉16進位制String時為什麼要乘上0xff
基本知識
1.byte是1byte(8位),int是4byte(32位)表示的。
2.Java中是使用了補碼的形式進行資料儲存的。
3.java中byte資料轉化為int資料時會自動補位,如果最高位(符號位)是0,則高24位全部補0,若是1,則高24位全部補1。
原因解析
如下程式碼:
public static String parseByte2HexStr(byte[] buf) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < buf.length; i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
正數
一個正數byte,轉為int時,前面補0。得到的依然是正數,而且值不變。
比如:1
byte 1=0000 0001 。轉為int 前面補0得到 0000 0000 0000 0000 0000 0000 0000 0001。所以做不做&0xff運算都一樣。
負數
負數byte,轉為int時,java為了保持值不變,預設前面補1。
比如:-1
byte -1二進位制以補碼儲存 11111 11111 。轉為int 前面補1得到 1111 1111 1111 1111 1111 1111 1111 1111。這個值在int確實是-1,但是如果Integer.toHexString()儲存為16進製得到0xffff ffff。當然我們可以用這個數儲存-1。
byte i=(byte) (0xffffffff)
i=-1;
但是會有兩個問題:1、儲存的字元長度難以統一 2、字串長度太長。
byte的取值範圍在[-128,127]之間,16進製表示用兩個符號就夠了0x00—0xff。負數如果用這麼多字元,造成正負數符號長度不統一怎麼儲存呢?從16進位制還原成2進位制時怎麼按長度區分各個數字呢?
所以我們把byte與運算&0xff。以-1為例:1111 1111 1111 1111 1111 1111 1111 1111 & 0xff 得到 0000 0000 0000 0000 0000 0000 1111 1111 即0xff。這個數結果依然是-1。
byte i=(byte) (0xff)
i=-1;
用這種方式處理後,byte不論正負,得到的都是二位的16進位制數。以兩位儲存,兩位還原,很方便。
也可以這樣還原。
以ff的16進位制數儲存:
byte i=(byte) (high * 16 + low);
i=-1;
總結
byte轉int時也是一樣的道理,-1與運算後得到0xff =255=1111 1111。把這個int轉為byte時就是-1。
相關文章
- C# 獲取時間戳並從10進位制時間戳轉換成16進位制byte陣列C#時間戳陣列
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- Solidity String轉byte32 byte轉StringSolid
- 什麼是二進位制?二進位制如何轉換?
- 16進位制字串轉位元組字串
- oracle_16進位制與10進位制轉換小示例Oracle
- 位元組流轉16進位制字串字串
- 資料轉換-16進位制字元字元
- 為什麼Android原始碼中都使用16進位制進行狀態管理?Android原始碼
- 負數補碼(16進位制轉10進位制的負數)
- JavaScript十進位制轉換為二進位制JavaScript
- C# 解析16進位制字串。將16進位制字串轉換成明文字串C#字串
- c++ 16進位制資料轉doubleC++
- PHP負數轉16進位制再轉到10進位制的正確姿勢PHP
- Qt進位制轉換(十進位制轉十六進位制)QT
- 3416:【例72.1】 二進位制轉化為十進位制
- 記憶體地址中的16進位制最小單位是1bit,1Byte?記憶體
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- JavaScript RGB轉換成16進位制顏色JavaScript
- 彙編實現10進位制轉16進位制並以ASCII碼輸出ASCII
- n進位制轉十進位制
- 十進位制轉十六進位制
- Python 十進位制轉換為二進位制 高位補零Python
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 整數轉化成八進位制、十六進位制、二進位制,以及轉回
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 為什麼分庫分表使用2的N次方 一個位元組用兩位16進位制
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- Java中8進位制和16進位制的表示方法Java
- Java 16進位制字串 取反Java字串
- 計算機中為什麼要用二進位制計算機
- 二進位制、十進位制與十六進位制相互轉化
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 二進位制轉十進位制快速方法
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- printf()將10進位制數安照輸出16進位制,8進位制輸出