std*_*err 13 python byte numbers
我如何找出一个特定数字需要存储的字节数,例如\ x00 - \xFF我希望获得1(字节),\ x100 - \xffff会给我2(字节)等等.任何线索?
Jon*_*nts 24
除非你正在处理一个array.array或一个numpy.array- 大小总是有对象开销.由于Python自然地与BigInts打交道,所以真的,真的很难说......
>>> i = 5
>>> import sys
>>> sys.getsizeof(i)
24
Run Code Online (Sandbox Code Playgroud)
因此,在64位平台上,它需要24个字节来存储可以以3位存储的内容.
但是,如果你这样做了,
>>> s = '\x05'
>>> sys.getsizeof(s)
38
Run Code Online (Sandbox Code Playgroud)
所以不,不是真的 - 你已经得到了内存开销object而不是原始存储......
如果你那么:
>>> a = array.array('i', [3])
>>> a
array('i', [3])
>>> sys.getsizeof(a)
60L
>>> a = array.array('i', [3, 4, 5])
>>> sys.getsizeof(a)
68L
Run Code Online (Sandbox Code Playgroud)
然后你会得到所谓的正常字节边界等等......等等......
如果你只是想要存储"纯粹"的东西 - 减去对象开销,那么从2.(6 | 7)你可以使用some_int.bit_length()(否则只是按照其他答案显示的位移)然后从那里工作
aba*_*ert 16
def byte_length(i):
return (i.bit_length() + 7) // 8
Run Code Online (Sandbox Code Playgroud)
当然,正如Jon Clements指出的那样,这不是PyIntObject具有PyObject标题的实际大小,并且以最容易处理的方式将值存储为bignum而不是最紧凑,并且你必须在实际对象的顶部至少有一个指针(4或8个字节),依此类推.
但这是数字本身的字节长度.这几乎肯定是最有效的答案,也可能是最容易阅读的答案.
或者ceil(i.bit_length() / 8.0)更具可读性?
你可以使用简单的数学:
>>> from math import log
>>> def bytes_needed(n):
... if n == 0:
... return 1
... return int(log(n, 256)) + 1
...
>>> bytes_needed(0x01)
1
>>> bytes_needed(0x100)
2
>>> bytes_needed(0x10000)
3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40027 次 |
| 最近记录: |