我需要一些帮助。我是python的新手。我试图完成以下用python编写的C ++。这就是我所拥有的:
C ++:
uint16_t value = (ReadData[1] << 8 | ReadData[2]);
int num = (short) value;
int total = ((0.89*num)+48.31);
Python:
ReadData = [0]*6
arr = bytes(ReadData)
value = arr2[0:3]
不确定如何采取像这样喷出的数组:
b'\xff\xff\xce'
到签名的int。
提前谢谢你。
答案 0 :(得分:2)
由于您正在使用bytes
和bytes
文字,我猜测您是否使用Python 3,在这种情况下,您有一个更好的通用选项来转换任意将字节运行到int
。 Python 3有一个惊人的全合一转换器。对于您的示例案例:
>>> int.from_bytes(b'\xff\xff\xce', 'big', signed=True)
-50
它可以扩展到巨大的尺寸,并且运行速度比其他任何可用的都快。
如果您不使用Python 3,它会稍微丑陋,但仍然相当快:
import binascii
def int_from_bytes(b):
x = int(binascii.hexlify(b), 16)
mask = 1 << (len(b) << 3) - 1
if x & mask:
x -= mask << 1
return x
当你这样做时,它会得到与Python 3内置相同的结果:
>>> int_from_bytes(b'\xff\xff\xce')
-50
关于性能的注意事项:如果预编译的struct.Struct
真的像一个填充字节后跟一个带符号的short
一样简单,那么预编译的Struct
将会获胜,没有可变长度的无意义。在这种情况下,您需要将unpacker = struct.Struct('>xh').unpack
预先编译为:
x, = unpacker(b'\xff\xff\xce')
然后你可以像这样使用它:
Struct.unpack
尾随逗号很重要(x,
在这种情况下返回len 1元组,并且分配给x
以最有效的方式将单个值解包为<input type="file" file-model="vm.myFile" />
<button data-ng-click="vm.uploadFile($files)" ng-file-select ng-file-change="vm.uploadFile($files)">upload me</button>
。
答案 1 :(得分:0)
Python支持与C ++非常相似的按位操作。如果您有一个名为int
的Python ReadData
数组,您可以执行以下操作:
value = (ReadData[1] & 0xFF) << 8 | (ReadData[2] & 0xFF)
total = ((0.89 * value) + 48.31)
& 0xFF
除了数字的最低字节之外的所有内容,这似乎是你想要的。
答案 2 :(得分:0)
使用struct
模块将bytes string解释为 C数据。
如果要将ReadData
的字节1和2解释为 big-endian 签名的16位整数,请执行以下操作:
import struct
ReadData = b'\xff\xff\xce'
# ReadData[1:] takes from ReadData[1] until ReadData[-1] (the last one)
num = struct.unpack('>h', ReadData[1:])
# Now num is -50
这相当于:
# Convert ReadData to unsigned int
num = (ReadData[1] & 0xFF) << 8 | (ReadData[2] & 0xFF)
# Change sign, assuming we got 16-bit number
num = num - 0x10000
将num
转换为total
应该是微不足道的:
total = ((0.89*num)+48.31)
但请注意,0.89 * num
将其转换为浮动,因此可能需要执行此操作,
total = int((0.89 * num) + 48.31)