魔豹聯盟Meta系統開發方案丨佛薩奇2.0系統開發技術講解

Tg_StPv888發表於2023-03-30

  去中心化應用成功的關鍵在於開發者可以有效控制去中心化資料的輸入和輸出。目前能夠實現這一點的方法並不多,不過至少我知道的目前有兩個新專案現正在研究其他的方法論。


  1 Python3的資料編碼


  Python3統一了編碼方式,字串就是str,位元組串就是bytes。字串str其實就是文字,統一使用Unicode編碼。而位元組串bytes就是原始的位元組,本質是二進位制數值。它們兩者之間可以互相轉化。


  1.1字串


  字串舉例:


  >>>s='字串abc'


  >>>s


  '字串abc'


  >>>type(s)


  <class'str'>


  如上例,字串使用引號表示。Python3統一使用Unicode編碼,所以可以正常顯示多種語言文字。


  1.2位元組串


  位元組串舉例:


  >>>b=b'xe5xadx97xe7xacxa6xe4xb8xb2abc'


  >>>b


  b'xe5xadx97xe7xacxa6xe4xb8xb2abc'


  >>>type(b)


  <class'bytes'>


  如上例,一個位元組串是以b開頭,每個位元組使用十六進位制數值表示的串。因為位元組串是儲存於計算機中的最原始的資料,本質上二進位制數值,但是為了提高閱讀效率,一般使用十六進位製表示。每個位元組以x開頭,表示這是一個原始的二進位制值。但是,在上例中,最後三個位元組卻沒有以x開頭,顯示的是字母abc。這就牽扯到Python的顯示規則了,如果該十六進位制值表示的是能夠列印的ASCII碼值,那麼就直接列印出來,不使用十六進位製表示。實際上,如果將末尾字母abc使用以x開頭的十六進位製表示,其本質也是相等的。


  >>>a=b'xe5xadx97xe7xacxa6xe4xb8xb2abc'


  >>>b=b'xe5xadx97xe7xacxa6xe4xb8xb2x61x62x63'


  >>>a==b


  True


  如上例,將abc使用其對應的十六進位制0x61,0x62,0x63表示,也是與原始位元組串相等的。


  2字串與位元組串的相互轉化


  字串與位元組串的轉化可以使用encode()和decode()兩個函式:


  字串轉化為位元組串:encode(),編碼。


  位元組串轉化為字串:decode(),解碼。


  encode和decode預設採用utf-8編碼。


  2.1字串轉化為位元組串


  >>>'字串abc'.encode()


  b'xe5xadx97xe7xacxa6xe4xb8xb2abc'


  2.2位元組串轉化為字串


  >>>b'xe5xadx97xe7xacxa6xe4xb8xb2abc'.decode()


  '字串abc'


  十六進位制字串


  在實際程式設計中,經常遇到十六進位制字串。


  >>>s='cc4a5ce1b3'


  >>>type(s)


  <class'str'>


  如上例,為了說明方便,本文把形如上例的字串s稱為十六進位制字串。當然,該字串的長度肯定是偶數。s本質上是一個字串,但是在實際的程式設計例項中,其表示原始資料,為了使用者友好,將原始的位元組數值轉化為使用者可以看到的十六進位制字串。


  3.1十六進位制字串轉化為位元組串


  在資料運算中,例如將該資料進行雜湊運算,肯定要對其原始二進位制數值進行雜湊運算。那麼就需要將該十六進位制字串轉化為原始的位元組串。


  在Python3中,可以使用bytes.fromhex()、binascii.a2b_hex()、binascii.unhexlify()函式將十六進位制字串轉化為其原始二進位制數值,即以x開頭表示的每個位元組。


  >>>bytes.fromhex('cc4a5ce1b3')


  b'xccJ\xe1xb3'


  >>>binascii.a2b_hex('cc4a5ce1b3')


  b'xccJ\xe1xb3'


  >>>binascii.unhexlify('cc4a5ce1b3')


  b'xccJ\xe1xb3'


  如上例,以上三個函式都可將十六進位制字串轉化為以b開頭的位元組串。但是,推薦使用bytes.fromhex()函式。這是因為該函式可以有效處理十六進位制字串中的空格,可以自動處理空格。


  >>>bytes.fromhex('cc4a 5c e1b3')


  b'xccJ\xe1xb3'


  1


  2


  如上例所示,如果十六進位制字串中含有空格,則bytes.fromhex()函式可以正確處理。


  3.2位元組串轉化為十六進位制字串


  可以使用hex()函式將原始資料位元組串轉化為可以閱讀的十六進位制字串。該函式是Python3.5新加入的。


  >>>b'xccJ\xe1xb3'.hex()


  'cc4a5ce1b3'


  >>>binascii.b2a_hex(b'xccJ\xe1xb3').decode()


  'cc4a5ce1b3'


  >>>binascii.hexlify(b'xccJ\xe1xb3').decode()


  'cc4a5ce1b3'


  如上例,可將以b開頭的位元組串轉化為十六進位制字串。雖然有三種方式可以此目標,但是還是推薦使用hex()函式更簡單快捷。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2942636/,如需轉載,請註明出處,否則將追究法律責任。

相關文章