Python十六进制摘要转换为整数

3
许多在线赌博游戏使用将哈希转换为0-(通常为2 ^ 52)的十进制数的函数。
这里是一些我找到的代码,它可以正常工作,但我不明白它为什么能工作:
def get_result(hash):
    hm = hmac.new(str.encode(hash),b'', hashlib.sha256) #hashing object

    h = hm.hexdigest() #hex digest, 32 bytes 256 bit
    print(h) #Something like 848ab848c6486d4f64
    c = int(h,16) 
    print(c) #numbers only, 77 numbers long...?
    if (c % 33 == 0): 
        return 1
    h = int(h[:13],16)
    return (((100 * E - h) / (E - h)) // 1) / 100.0

我不明白的代码部分是从h到c的转换。 h是十六进制摘要,因此它是基于16的。Python文档说int(a,b)函数将字符串a转换为基于b的整数。我的问题是:
  1. 一个整数怎么能是基于16的? 十进制不是定义为10个数字(0-9)吗?这额外的6从哪里来?
  2. 据我所知,一个单独的十六进制数字可以由4位或1/2字节存储。 因此,长度为64的十六进制字符串将占用32个字节。 这是否意味着任何此数据的基础也将是32个字节? (将十六进制字符串转换为基于n的字符串,其中n是任何值)
  3. c变量始终是77位长的含义是什么?

2
十六进制是一种基于16的数字系统。通常用4位(半个字节)表示。因此,你可以从0000、0001...到1111得到2^4或者16个可能的值。在十六进制中,我们使用字母a、b、c、d、e、f来表示超过9的数。int函数将一个表示为字符串的n进制整数转换为Python整数。当你打印这个转换后的整数时,你会得到一个与平常一样的十进制输出。所以10 == int("a", 16) - flakes
你看到的77个数字是因为2^256在十进制中约等于1.16e+77。 - flakes
1个回答

3
一个整数如何可以是十六进制的?多出来的6又是从哪里来的?
这被称为十六进制(hexadecimal system)。
不是十进制定义为基数10(0-9)吗?
整数和小数不是同义词。你可以有一个二进制的整数而不是十进制的。
据我所知,一个十六进制数字可以由4个比特或半字节存储。因此,长度为64的十六进制字符串将占用32个字节。
这里有两个不同的概念:十六进制字符串和十六进制整数。
当你在Python中输入例如"8ff"时,你创建了一个长度为3的十六进制字符串。字符串是字符的数组。字符在底层上是1字节整数。因此,你存储了3个字节¹(关于你的第二个语句,长度为64的十六进制字符串实际上将占用64个字节)。
现在,当您在Python中键入0x8ff时,您正在创建一个由3个数字组成的十六进制整数。如果您打印它,它将显示2303,因为从基数16(8ff,十六进制)转换为基数10(2303,十进制)。单个整数存储4字节²,因此您正在存储4个字节

这是否意味着该数据的任何基数也将是32字节?(将十六进制字符串转换为基数n,其中n可以是任何值)

这取决于什么类型的数据?

  • 长度为3的字符串将始终占用3个字节(让我们忽略Unicode),无论是"8ff"还是"123"

  • 长度为10的字符串将始终占用10个字节,无论是"85d8afff"还是"ef08c0e38e"

  • 整数将始终占用4个字节³,无论是10还是1000000。

“c变量始终为77位数字”这一事实意味着什么?
正如@flakes所指出的那样,这是因为2^256在十进制中约等于1.16e+77。

¹ 事实上,长度为3的字符串存储了4个字节:三个用于字符,一个用于空终止符。

¹ 让我们忽略Python中整数是无界限的这一点。

² 如果它小于2,147,483,647(有符号)或4,294,967,295(无符号)。


请注意,在Python中,字符串字符根据编码方式并不总是一个字节。例如,在utf8编码中,可能会出现像表情符号这样的字符,这就违反了这个规则。 - flakes
是的,这就是我在“让我们忽略Unicode”中所指的意思。 - enzo
@flakes 但十六进制字符串将只包含ASCII字符,而现代版本的Python将优化每个字符为单个字节。 - Mark Ransom
我主要是在评论“A character is (under the hood) a 1-byte integer.”这句话中使用的语言。 - flakes
目前我脑海中没有想到,但我在想是否有除了Unicode(或Unicode的子集)之外的其他常见字符编码,它们使用多字节字符实现。 - flakes
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接