将C ++中的数组操作转换为Python

时间:2015-12-03 19:09:29

标签: python c++ arrays

我需要一些帮助。我是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。

提前谢谢你。

3 个答案:

答案 0 :(得分:2)

由于您正在使用bytesbytes文字,我猜测您是否使用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)