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#時間戳陣列
- 3416:【例72.1】 二進位制轉化為十進位制
- Delphi的嵌入式asm一例: Byte快速轉換為16進位制字串 (轉)ASM字串
- 什麼是二進位制?二進位制如何轉換?
- 十進位制轉化為2/8/16
- JavaScript 進位制轉換(2進位制、8進位制、10進位制、16進位制之間的轉換)JavaScript
- shell 中轉換16進位制10進位制
- 口算 16 進位制轉換 10 進位制,但只適合兩位的 16 進位制
- 十六進位制轉換為八進位制
- 十六進位制轉換為十進位制
- 10進位制和16進位制互轉的例子
- java中如何將byte[]裡面的資料轉換成16進位制字串Java字串
- JavaScript十進位制轉換為二進位制JavaScript
- C# 2進位制、8進位制、10進位制、16進位制...各種進位制間的輕鬆轉換C#
- 2進位制_8進位制_16進位制之間快速轉換的技巧.txt
- 為什麼Android原始碼中都使用16進位制進行狀態管理?Android原始碼
- 16進位制字串轉位元組字串
- 2/8/16轉10進位制
- oracle_16進位制與10進位制轉換小示例Oracle
- sql實現10進位制16進位制轉換函式SQL函式
- sql 數字轉換為16進位制數函式SQL函式
- lua之m進位制轉換為n進位制-任意進位制轉換演算法演算法
- Solidity String轉byte32 byte轉StringSolid
- Qt進位制轉換(十進位制轉十六進位制)QT
- JavaScript 二進位制數字轉換為十進位制JavaScript
- 負數補碼(16進位制轉10進位制的負數)
- 計算機中為什麼要用二進位制計算機
- 位元組流轉16進位制字串字串
- 資料轉換-16進位制字元字元
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- 1474 十進位制轉m進位制+1475 m進位制轉十進位制
- n進位制轉十進位制
- 十進位制轉十六進位制
- C# 解析16進位制字串。將16進位制字串轉換成明文字串C#字串
- MySQL什麼時候輪換二進位制日誌MySql
- PHP負數轉16進位制再轉到10進位制的正確姿勢PHP
- 遞迴函式實現十進位制正整數轉換為二進位制,八進位制,十六進位制遞迴函式
- 1161:轉進位制(C C++)C++