23

特定の整数が格納するのにかかるバイト数を知るにはどうすればよいですか?

例:

  • 16進数\x00- \xff(または10進数0- 255= 2進数0000 0000- 1111 1111)1(バイト)を取得しようとしています。
  • 16進数\x100- \xffff(または10進数256- 65535= 2進数0000 0001 0000 0000- 1111 1111 1111 1111)は2(バイト)になります

等々。

入力として16進形式または10進形式の手がかりはありますか?

4

6 に答える 6

30

array.arrayまたはを扱っていない限りnumpy.array、サイズには常にオブジェクトのオーバーヘッドがあります。そして、Python は BigInts を自然に処理するため、それを判断するのは非常に困難です...

>>> i = 5
>>> import sys
>>> sys.getsizeof(i)
24

したがって、64 ビット プラットフォームでは、3 ビットで格納できるデータを格納するには 24 バイトが必要です。

しかし、あなたがした場合、

>>> s = '\x05'
>>> sys.getsizeof(s)
38

いいえ、そうではありません-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

次に、通常のバイト境界などと呼ばれるものを取得します...など...など...

「純粋に」格納する必要があるものだけが必要な場合は、オブジェクトのオーバーヘッドを差し引いて、2.(6|7) から使用できますsome_int.bit_length()(そうでない場合は、他の回答が示しているようにビットシフトするだけです)。

于 2013-01-15T01:38:37.967 に答える
28
def byte_length(i):
    return (i.bit_length() + 7) // 8

もちろん、Jon Clements が指摘しているように、これは実際の のサイズではありません。PyIntObjectこれには PyObject ヘッダーがあり、値を bignum として保存します。これは、最もコンパクトではなく、処理が最も簡単な方法であり、それを行う必要があります。実際のオブジェクトの上に少なくとも 1 つのポインター (4 または 8 バイト) がある、など。

ただし、これは数値自体のバイト長です。これはほぼ確実に最も効率的な回答であり、おそらく最も読みやすい回答でもあります。

それともceil(i.bit_length() / 8.0)もっと読みやすいですか?

于 2013-01-15T01:48:07.440 に答える
12

簡単な数学を使用できます。

>>> 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
于 2013-01-15T01:39:25.387 に答える
4

単純なバイワイズ操作を使用して、使用されているすべてのビットを毎回 1 バイト以上移動することにより、数値を格納するために必要なバイト数を確認できます。

このメソッドは非常に汎用的ですが、負の数では機能せず、格納されているものを考慮せずに変数のバイナリのみを参照することに注意してください。

a = 256
i = 0

while(a > 0):
    a = a >> 8;
    i += 1;

print (i)

プログラムは次のように動作します。

a は0000 0001 0000 00002 進数で、ループを実行するたびにこれを左に 8 シフトします。

loop 1:
0000 0001 >> 0000 0000
0000 0001 > 0 (1 > 0)

loop 2:

0000 0000 >> 0000 0001
0000 0000 > 0 (0 > 0)

END 0 is not > 0

そのため、数値を格納するには 2 バイトが必要です。

于 2013-01-15T01:37:18.137 に答える
0
# Python 3

import math

nbr = 0xff                 # 255 defined in hexadecimal
nbr = "{0:b}".format(nbr)    # Transform the number into a string formated as bytes.

bit_length = len(nbr)      # Number of characters
byte_length = math.ceil( bit_length/8 ) # Get minimum number of bytes
于 2016-04-19T19:39:18.340 に答える