6

Python で 4 バイトなどの固定サイズの整数を作成したい。C のバックグラウンドから来たので、すべてのプリミティブ型がメモリ内の一定のスペースを占有すると予想していましたが、Python で次のことを試してみると、次のようになります。

import sys  
print sys.getsizeof(1000)
print sys.getsizeof(100000000000000000000000000000000000000000000000000000000)

私は得る

>>>24  
>>>52

それぞれ。
Pythonで4バイトの固定サイズ(符号なし)整数を作成するにはどうすればよいですか? 後でアセンブリを使用してバイト レベルのメモリ操作を行う必要があるため、バイナリ表現が 3 ビットまたは 23 ビットのどちらを使用するかに関係なく、4 バイトにする必要があります。

4

4 に答える 4

5

修飾子 (unsigned int)struct.packと共に使用できます。Iこの関数は、整数が 4 バイトに収まらない場合に警告します。

>>> from struct import *
>>> pack('I', 1000)
'\xe8\x03\x00\x00'
>>> pack('I', 10000000)
'\x80\x96\x98\x00'
>>> pack('I', 1000000000000000)
sys:1: DeprecationWarning: 'I' format requires 0 <= number <= 4294967295
'\x00\x80\xc6\xa4'

エンディアンを指定することもできます。

于 2013-10-31T20:49:50.247 に答える
4

私がこれを行う方法(通常、ハードウェアに送信する前に固定幅の整数を確保するため)は、ctypesを使用します

from ctypes import c_ushort 

def hex16(self, data):
    '''16bit int->hex converter'''
    return  '0x%004x' % (c_ushort(data).value)
#------------------------------------------------------------------------------      
def int16(self, data):
    '''16bit hex->int converter'''
    return c_ushort(int(data,16)).value

それ以外の場合、構造体はそれを行うことができます

from struct import pack, unpack
pack_type = {'signed':'>h','unsigned':'>H',}
pack(self.pack_type[sign_type], data)
于 2013-10-31T20:52:26.853 に答える
1

あなたはここに何かが欠けていると思います

文字を送信すると、1バイト送信されるため、

sys.getsizeof('\x05') 

8 より大きいレポートを送信しても、まだ 1 バイトしか送信されていません。余分なオーバーヘッドは、python のすべてに接続されている python メソッドであり、それらは送信されません。

あなたは構造体パックの回答について不満を言いgetsizeofましたが、c_ushortの回答を受け入れたので、これをお見せしようと思いました

>>> sys.getsizeof(struct.pack("I",15))
28
>>> sys.getsizeof(c_ushort(15))
80

ただし、両方の答えはあなたが望むことを正確に行うべきだと言いました

于 2013-10-31T21:48:21.453 に答える
0

これを行うためのより良い方法があるかどうかはわかりませんが、私の単純なアプローチは次のとおりです。

def intn(n, num_bits=4):
    return min(2 ** num_bits - 1, n)
于 2013-10-31T20:48:38.243 に答える