十六進(jìn)制的字符串倒是有現(xiàn)成的函數(shù),bytearray.fromhex就可以轉(zhuǎn)換,二進(jìn)制的就只有你自己解析了。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),通州企業(yè)網(wǎng)站建設(shè),通州品牌網(wǎng)站建設(shè),網(wǎng)站定制,通州網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,通州網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
將字符串每4個(gè)字符,進(jìn)行處理,轉(zhuǎn)換成0~F的16進(jìn)制字符,然后再用bytearray、bytes的fromhex轉(zhuǎn)換
說(shuō)實(shí)話(huà)我沒(méi)搞懂為啥要弄成二進(jìn)制字符串,這不是浪費(fèi)空間么,用文本表示,都是用的HEX字符串或者BASE64
上一次我們說(shuō)到了Hex與Bytes的轉(zhuǎn)換,很快我們又遇到了bit位的判斷。
場(chǎng)景如下:我們需要判斷DTC_Status的8個(gè)bit中任意一個(gè)或幾個(gè)bit的狀態(tài)。假設(shè)DTC_Status=0x2F,我們需要判斷bit0和bit3是否為1.
解決這個(gè)問(wèn)題的方法有很多。程序員往往喜歡用bit移位后與上0或1來(lái)進(jìn)行判斷。
但我總覺(jué)得這種方法不夠直觀,所以我通常會(huì)將每一個(gè)Bit都展開(kāi)后,再去判斷。
下面寫(xiě)一下大致的思路。
轉(zhuǎn)換后,DTC_Status已經(jīng)是一個(gè)字符串了,其中包含了8個(gè)bits的0,1狀態(tài)。
有了這個(gè)函數(shù)后,我們就可以用bits_compare(DTC_Status , 'xxxx1xx1')的方式來(lái)判斷DTC_Status了。x代表不需要判斷的位。
這里也順便提下,有時(shí),我們也需要將一個(gè)二進(jìn)制的值,如:'00001001' 轉(zhuǎn)為十進(jìn)制或十六進(jìn)制。
此時(shí),我們可以用int,加參數(shù)2來(lái)實(shí)現(xiàn)。通過(guò)字符串的切片操作,我們也可以更改某個(gè)bit的值。
python中的進(jìn)制轉(zhuǎn)換和原碼,反碼,補(bǔ)碼
計(jì)算機(jī)文件大小單位
b = bit 位(比特)
B = Byte 字節(jié)
1Byte = 8 bit #一個(gè)字節(jié)等于8位 可以簡(jiǎn)寫(xiě)成 1B = 8b
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
1EB = 1024PB
進(jìn)制分類(lèi)
二進(jìn)制:由2個(gè)數(shù)字組成,有0 和 1 python中標(biāo)志:0b
八進(jìn)制:由8個(gè)數(shù)字組成,有0,1,2,3,4,5,6,7 python中標(biāo)志:0o
十進(jìn)制:有10個(gè)數(shù)字組成,有0,1,2,3,4,5,6,7,8,9 python中標(biāo)志:無(wú)
十六進(jìn)制:有16個(gè)數(shù)字組成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f(進(jìn)制字母大小寫(xiě)都可以,分別代表10,11,12,13,14,15) python中標(biāo)志:0x
python中的進(jìn)制轉(zhuǎn)換:
其他進(jìn)制轉(zhuǎn)換為十進(jìn)制:int(相應(yīng)進(jìn)制)
其他進(jìn)制轉(zhuǎn)換為二進(jìn)制:bin(相應(yīng)進(jìn)制)
其他進(jìn)制轉(zhuǎn)換為八進(jìn)制:oct(相應(yīng)進(jìn)制)
其他進(jìn)制轉(zhuǎn)換為十六進(jìn)制:hex(相應(yīng)進(jìn)制)
二進(jìn)制 轉(zhuǎn)化成 十進(jìn)制:
例: 0b10100101
運(yùn)算:1* 2^0 + 0* 2^1 + 1* 2^2 + 0* 2^3 + 0* 2^4 + 1* 2^5 + 0* 2^6 + 1* 2^7=
1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165
八進(jìn)制 轉(zhuǎn)化成 十進(jìn)制:
例: 0o127
運(yùn)算:7*8^0 + 2*8^1 + 1*8^2 = 7+16+64 = 87
十六進(jìn)制 轉(zhuǎn)化成 十進(jìn)制:
例: 0xff
運(yùn)算:15*16^0 + 15*16^1 = 255
十進(jìn)制 轉(zhuǎn)化成 二進(jìn)制:
426 = 0b110101010
運(yùn)算過(guò)程: 用426除以2,得出的結(jié)果再去不停地除以2,
直到除完最后的結(jié)果小于2停止,
在把每個(gè)階段求得的余數(shù)從下到上依次拼接完畢即可
十進(jìn)制 轉(zhuǎn)化成 八進(jìn)制:? ?
426 = 0o652
運(yùn)算過(guò)程: 用426除以8,得出的結(jié)果再去不停地除以8,
直到除完最后的結(jié)果小于8停止,
在把每個(gè)階段求得的余數(shù)從下到上依次拼接完畢即可
十進(jìn)制 轉(zhuǎn)化成 十六進(jìn)制:? ?
運(yùn)算過(guò)程: 用426除以16,得出的結(jié)果再去不停地除以16,
直到除完最后的結(jié)果小于16停止,
在把每個(gè)階段求得的余數(shù)從下到上依次拼接完畢即可。
相關(guān)推薦:《Python視頻教程》
原碼,反碼,補(bǔ)碼
實(shí)際人們看到的數(shù)字是原碼轉(zhuǎn)化之后顯示出來(lái)的。
而原碼是通過(guò)補(bǔ)碼得到的。
計(jì)算機(jī)的所有數(shù)據(jù)在底層都是以二進(jìn)制的補(bǔ)碼形式存儲(chǔ)。
***進(jìn)制轉(zhuǎn)換的時(shí)候需要先把內(nèi)存存儲(chǔ)的補(bǔ)碼拿出來(lái)變成原碼在進(jìn)行轉(zhuǎn)換輸出***
反碼:二進(jìn)制碼0變1,1變0叫做反碼,反碼用于原碼補(bǔ)碼之間的轉(zhuǎn)換。
補(bǔ)碼:用來(lái)做數(shù)據(jù)的存儲(chǔ)運(yùn)算,可以實(shí)現(xiàn)計(jì)算機(jī)底層的減法操作,因而提出(可以表達(dá)出一個(gè)數(shù)的正負(fù))。
也就是說(shuō)默認(rèn)計(jì)算機(jī)只會(huì)做加法,例:5+(-3) = 5 - 3。
乘法除法是通過(guò)左移和右移 來(lái)實(shí)現(xiàn)。
正數(shù)高位補(bǔ)0,負(fù)數(shù)高位補(bǔ)1。
正數(shù):
原碼 = 反碼 = 補(bǔ)碼
負(fù)數(shù):
反碼 = 原碼取反(除高位)
補(bǔ)碼 = 反碼加1
反碼 = 補(bǔ)碼減1
原碼 = 反碼取反(除高位)
我們會(huì)發(fā)現(xiàn),在取反前減1和在取反后加1的效果是一樣的,這就和-2-1 = -(2+1)一個(gè)道理,所以會(huì)得出這樣的規(guī)律:
原碼 = 補(bǔ)碼取反加1
補(bǔ)碼 = 原碼取反加1
一個(gè)數(shù)在計(jì)算機(jī)中的二進(jìn)制表示形式, 叫做這個(gè)數(shù)的機(jī)器數(shù)。機(jī)器數(shù)是帶符號(hào)的,在計(jì)算機(jī)用一個(gè)數(shù)的最高位存放符號(hào), 叫符號(hào)位正數(shù)為0, 負(fù)數(shù)為1。
比如
正數(shù)1在計(jì)算機(jī)中的存儲(chǔ)即為
0 00000000000000000000001
負(fù)數(shù)1 在計(jì)算機(jī)中的存儲(chǔ)即為
1 00000000000000000000001
一個(gè)正數(shù),轉(zhuǎn)換為二進(jìn)制位就是這個(gè)正數(shù)的原碼。負(fù)數(shù)的絕對(duì)值轉(zhuǎn)換成二進(jìn)制位然后在高位補(bǔ)1就是這個(gè)負(fù)數(shù)的原碼。
正數(shù)的反碼就是原碼,負(fù)數(shù)的反碼等于原碼除符號(hào)位以外所有的位取反。
正數(shù)的補(bǔ)碼與原碼相同,負(fù)數(shù)的補(bǔ)碼為 其原碼除符號(hào)位外所有位取反(得到反碼了),然后最低位加1。
所以原碼,反碼,補(bǔ)碼正數(shù)情況下是一致的,負(fù)數(shù)情況下是不一致的。
計(jì)算機(jī)的運(yùn)算過(guò)程實(shí)際就是補(bǔ)碼相加的一個(gè)過(guò)程。
比如-2 + 3
-2 的原碼為
1 000000000000000000000000010
反碼為:
1 111111111111111111111111101
補(bǔ)碼為:
1 111111111111111111111111110
3的原碼為
0 000000000000000000000000011
反碼為:
0 000000000000000000000000011
補(bǔ)碼為:
0 000000000000000000000000011
那么二者補(bǔ)碼相加結(jié)果為
1 111111111111111111111111110
+
0 000000000000000000000000011
=
10 000000000000000000000000001(計(jì)算機(jī)存儲(chǔ)為32位,故前面溢出的1被舍棄,高位為0)
0 000000000000000000000000001
結(jié)果為1
再比如-2 + 1
-2 的原碼為
1 000000000000000000000000010
反碼為:
1 111111111111111111111111101
補(bǔ)碼為:
1 111111111111111111111111110
1的原碼為
0 000000000000000000000000001
1的反碼為:
0 000000000000000000000000001
1的補(bǔ)碼為:
0 000000000000000000000000001
二者的補(bǔ)碼相加結(jié)果為
1 111111111111111111111111110
+
0 000000000000000000000000001
=
1 111111111111111111111111111
得出的補(bǔ)碼轉(zhuǎn)化為原碼, 最低位減一得到反碼,然后除符號(hào)位外所有位取反,得到結(jié)果
1 000000000000000000000000001
結(jié)果為1