位元組陣列轉化為十六進製制字串和 0xff的使用問題

2021-10-04 11:03:14 字數 1460 閱讀 5397

最近忙於找工作,受疫情影響不是很順利,好在最後還是找到了份還算可以的工作,好啦,不那麼多廢話了,現在就來談談今天工作上遇到的問題。

今天在研究後台報文的傳輸時,碰到了個小問題吧,就是在個加密演算法中這個位元組陣列轉化為十六進製制字串時的&0xff沒有弄得很懂,在網上收集了一些資料,才發現其中的秘密,接下來就上**:

public

static list

bytestohexlist

(byte

bytes)

return list;

}

為什麼要對位元組每個都新增& 0xff呢?這涉及到了計算機基礎知識:

&是位與運算:

1 & 1 = 1

0 & 1 = 0

0 & 0 = 0

0xff是十六進製制數(十進位制為255),因為其是int型別,所以二進位制表示

為:0000 0000 0000 0000 0000 0000 1111 1111

這樣 a & 0xff 的意思就是取a的低八位。

例1:

byte b =2;

int i = b &

0xff

;

分析:

1、b的二進位制為:0000 0010 ,要和int型別的0xff運算,首先要進行型別轉換,將b轉換成int型別,

2、int型別的2的二進位制為:0000 0000 0000 0000 0000 0000 0000 0010

3、與0xff進行&運算,結果i為:0000 0000 0000 0000 0000 0000 0000 0010

發現結果仍然是2,沒有變,那位啥還要 &0xff呢?這是因為雖然正數不變,可負數就不一樣了,負數如果不&0xff 就會錯。

注意:負數在計算機中是以補碼的形式存在的,補碼的計算方法如下:

1、原數取絕對值;

2、將其二進位制按位取反(1變0,0變1)

3、加1

例2:

-

2的補碼計算:

1、2的絕對值:0000

0010

2、取反:1111

1101

3、加1

:1111

1110

例3:

byte b =-2

;int i = b &

0xff

;

分析:

1、b的二進位制為:1111 1110

2、轉換成int型別的-2,其二進位制為:1111 1111 1111 1111 1111 1111 1111 1110

(原來是0xfe,現在變成了0xfffffffe,發生了符號補位,結果就不對了,所以需要將高位清除)
3、與0xff進行&運算,結果i為:0000 0000 0000 0000 0000 0000 1111 1110 (取了低8位,十六進製制為fe)

位元組陣列轉化為十六進製制字串時 0xff

我是資源的搬運工 byte 為什麼要 0xff byte 為什麼要 0xff 位元組陣列轉換成字串hex表示 param data 位元組陣列 return 位元組陣列的hex字串表示 public static string bytes2hexstring byte data stringbuil...

十六進製制字串轉換為位元組陣列

第一步 將十六進製制的字串除以二,算出位元組陣列的長度 第二步 根據位元組陣列的長度,建立位元組陣列 第三步 將字串轉換為字元陣列 第四步 將字元轉換為位元組 第五步 十六進製制的位元組分為高四位與低四位,所以將高四位的位元組左移4位,再與第四位的位元組相或,就得到乙個十六進製制的位元組 第六步,將...

十六進製制字串轉化為byte陣列

工作上有這樣的需求之前找了好多都不行,好不容易有個可以的趕緊留下來。原址 字串轉換成十六進製制字串方法1 字串轉換成十六進製制字串 public static string str2hexstr string str return sb.tostring 十六進製制字串轉換成為陣列方法1 把16進製...