魔豹联盟Meta系统开发方案丨佛萨奇2.0系统开发技术讲解
去中心化应用成功的关键在于开发者可以有效控制去中心化数据的输入和输出。目前能够实现这一点的方法并不多,不过至少我知道的目前有两个新项目现正在研究其他的方法论。 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()函数更简单快捷。
发表回复