6

我想在 python 中创建一个固定大小的整数,例如 4 个字节。来自 C 背景,我希望所有原始类型都将占用内存中的恒定空间,但是当我在 python 中尝试以下操作时:

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

我明白了

>>>24  
>>>52

分别。
如何在 python 中创建一个 4 字节的固定大小(无符号)整数?无论二进制表示是使用 3 位还是 23 位,我都需要它是 4 个字节,因为稍后我将不得不使用 Assembly 进行字节级内存操作。

4

4 回答 4

5

您可以使用struct.pack修饰符I(unsigned int)。当整数不适合四个字节时,此函数将发出警告:

>>> 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

否则 struct 可以做到

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 您在发送时仍然只发送一个字节。额外的开销是附加到python中所有东西的python方法,那些不会被传输

你抱怨getsizeofstruct pack 的答案,但接受了 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 回答