Python int.to_字节长度计算
可能是个愚蠢的问题,但我偶然发现了int.to_bytes()函数,我无法解释为什么我必须添加“+7”,如果我计算字节长度,并且文档中没有任何提示。我肯定我错过了一些位/字节计算魔术,但我需要社区的帮助 让我困惑的示例:Python int.to_字节长度计算,python,python-3.x,Python,Python 3.x,可能是个愚蠢的问题,但我偶然发现了int.to_bytes()函数,我无法解释为什么我必须添加“+7”,如果我计算字节长度,并且文档中没有任何提示。我肯定我错过了一些位/字节计算魔术,但我需要社区的帮助 让我困惑的示例:x.to_字节((x.bit_length()+7)//8,byteorder='little')from 提前感谢bit_length返回用二进制表示整数所需的位数,不包括符号和前导零。所以 x.bit_length() + 7) // 8 将只给出表示该整数x所需的字节数。
x.to_字节((x.bit_length()+7)//8,byteorder='little')
from
提前感谢
bit_length
返回用二进制表示整数所需的位数,不包括符号和前导零。所以
x.bit_length() + 7) // 8
将只给出表示该整数x
所需的字节数。你也可以写类似的东西
from math import ceil
ceil(x.bit_length / 8)
得到相同的号码
方法to_bytes()
要求将此字节长度作为其第一个参数。要解释x==0
,您可能希望将该案例包括到:
x.to_bytes(length=(min(x.bit_length(), 1) + 7) // 8, byteorder='little')
bit_length
返回表示二进制整数所需的位数,不包括符号和前导零。所以
x.bit_length() + 7) // 8
将只给出表示该整数x
所需的字节数。你也可以写类似的东西
from math import ceil
ceil(x.bit_length / 8)
得到相同的号码
方法to_bytes()
要求将此字节长度作为其第一个参数。要解释x==0
,您可能希望将该案例包括到:
x.to_bytes(length=(min(x.bit_length(), 1) + 7) // 8, byteorder='little')
一个字节有8位。+7只是确保
/8
四舍五入到最接近的整字节的一种低级方法。@Samwise-这很有意义。我跑x=10;x、 在python.org上的pythonshell上使用bit_length()
,并获得4
。有道理,您需要舍入到最接近的整数字节。另一种方法可能是x.to_字节(math.ceil((x+1)/256),“little”)
。对我来说,只需除以一个完整字节的int值并使用math.ceil
比使用bit\u length
并对位数进行模拟要简单一些。@Samwise好的,现在我明白了。我没有想到/
不是“真正的”部门,而是楼层部门。现在这对我来说很有意义。因为每个人都不知道true和floor division之间的区别:一个字节中有8位。+7只是确保/8
四舍五入到最接近的整字节的一种低级方法。@Samwise-这很有意义。我跑x=10;x、 在python.org上的pythonshell上使用bit_length()
,并获得4
。有道理,您需要舍入到最接近的整数字节。另一种方法可能是x.to_字节(math.ceil((x+1)/256),“little”)
。对我来说,只需除以一个完整字节的int值并使用math.ceil
比使用bit\u length
并对位数进行模拟要简单一些。@Samwise好的,现在我明白了。我没有想到/
不是“真正的”部门,而是楼层部门。现在这对我来说很有意义。因为每个人都不知道true和floor division之间的区别:你可能想在那里抛出一个min
:min(8,x.bit\u length()+7)
,因为0
有.bit\u length()==0
@Simon Fromme感谢您的解释,但我缺少的链接是/
切掉了这一点后面的所有内容。您可能想在那里抛出min
:min(8,x.bit_length()+7)
,因为0
具有。bit_length()==0
@Simon Fromme感谢您的解释,但我缺少的链接是/
切断了所有隐藏的内容。