【问题标题】:Strange representation of Bytes in PythonPython中字节的奇怪表示
【发布时间】:2020-01-31 03:13:20
【问题描述】:

我有一个散列字符串的简单程序。

from Crypto.Hash import SHA512

PAYLOAD = "Hello world"

def sha(message):
    h = SHA512.new()
    h.update(message.encode('ascii'))
    return h.digest()


if __name__ == '__main__':
    print(sha(PAYLOAD))
    print(type(sha(PAYLOAD)))

这是输出,

b'\xb7\xf7\x83\xba\xed\x82\x97\xf0\xdb\x91tb\x18O\xf4\xf0\x8ei\xc2\xd5\xe5\xf7\x9a\x94&\x00\xf9r_X\xce\x1f)\xc1\x819\xbf\x80\xb0l\x0f\xff+\xdd4s\x84R\xec\xf4\x0cH\x8c"\xa7\xe3\xd8\x0c\xdfo\x9c\x1c\rG'

我不明白这是一个字节数组吗?

【问题讨论】:

  • take \xb7: 这意味着 1 字节值 0xB7 十六进制。您可以使用hexdigest 来获取字符串。并且显示非 x 符号是因为它们在 ASCII 可显示范围内。
  • 每个字节由一对十六进制数表示;例如,在字节“10110111”中,前四位数字转换为 0xB(十进制 11),后四位数字转换为 0x7。
  • 你的代码有两个print()调用,为什么只有一行输出?

标签: python byte sha


【解决方案1】:

digest() is documented 返回一个bytes 对象,而bytes 对象正是你得到的:https://docs.python.org/3/library/stdtypes.html#bytes-objects

bytearraybytes 相似,但并不完全相同(它基本上是bytes 的可变版本)。

如果你需要一个整数列表,你可以简单地调用list()

>>> list(b'\xb7\xf7\x83\xba\xed\x82\x97\xf0\xdb\x91tb\x18O\xf4\xf0\x8ei\xc2\xd5\xe5\xf7\x9a\x94&\x00\xf9r_X\xce\x1f)\xc1\x819\xbf\x80\xb0l\x0f\xff+\xdd4s\x84R\xec\xf4\x0cH\x8c"\xa7\xe3\xd8\x0c\xdfo\x9c\x1c\rG')
[183, 247, 131, 186, 237, 130, 151, 240, 219, 145, 116, 98, 24, 79, 244, 240, 142, 105, 194, 213, 229, 247, 154, 148, 38, 0, 249, 114, 95, 88, 206, 31, 41, 193, 129, 57, 191, 128, 176, 108, 15, 255, 43, 221, 52, 115, 132, 82, 236, 244, 12, 72, 140, 34, 167, 227, 216, 12, 223, 111, 156, 28, 13, 71]

如果您需要 SHA 摘要的十六进制表示,可以使用hexdigest()

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多