这是一个简单的Python(版本3.4)代码,用于从4个字节的数组中获取32位大小的整数(我认为是int类型):
import binascii
import socket
import struct
import array
import pickle
import ctypes
import numpy
import sys
float_val = 1.0 + 0.005
print(float_val)
packed = struct.pack('f', float_val)
print(len(packed))
tempint2 = struct.unpack(">I", packed)[0]
tempint3 = struct.unpack_from(">I", packed)[0]
tempint4 = int.from_bytes(packed, byteorder='big', signed=False)
print(sys.getsizeof(tempint2))
print(tempint2)
print(sys.getsizeof(tempint3))
print(tempint3)
print(sys.getsizeof(tempint4))
print(tempint4)
但是,没有任何尝试(tempint2 / tempint3 / tempint4)给出我期望的值(4字节大小的整数)。不知何故,大小全是18个字节(sys.getsizeof()函数结果)。你能告诉我如何得到预期的答案(4字节或32位大小的整数)吗?
答案 0 :(得分:0)
首先,由于Python ......咳..."魔术",sys.getsizeof()
不会返回len
gth list
,但sizeof
整个数据结构由Python解释器在内部表示。
现在,答案(对于整数)只是......(对于Python 2.x / Python 3.x和32位/ 64位的所有组合):
from math import ceil, floor, log
def minimumAmountOfBytesToHoldTheStuff(x):
# Avoid math domain errors
if x < 0:
x = ~x
# Avoid more math domain erros
if x == 0:
x = 1
return int(ceil((floor(log(x, 2)) + 1 ) / 8))
def powersOfTwo():
x = 1
while True:
yield x
x *= 2
def minimumAmountOfBytesToHoldTheStuffOnRealMachines(x):
bytes = minimumAmountOfBytesToHoldTheStuff(x)
for power in powersOfTwo():
if bytes <= power:
return power
print(minimumAmountOfBytesToHoldTheStuffOnRealMachines(tempint))
注意:log(x, 2)
似乎中断了x >= pow(2, 48) - 1
,整个算法也是如此。这可能是C库/愚蠢的浮点符合性错误的问题,因为Python中的log(n, x)
在C中被转换为log(n) / log(x)
。
编辑:这是Python 3.x的优化版本,独立于机器人浮点和对数操作,因此在所有情况下都是准确的...
from math import ceil
def minimumAmountOfBytesToHoldTheStuff(x):
# Avoid math domain errors
if x < 0:
x = ~x
# Avoid more math domain erros
if x == 0:
x = 1
return int(ceil(x.bit_length() / 8))
其他功能相同。
我希望这能为你带来一些启示!