串行Python3上的二进制表示

时间:2016-08-09 13:41:44

标签: python python-3.x binary pyserial

我以ascii表示形式在串行上写各种字节。

以下是一个例子:bytes_to_write = '\aa' # Will write 01010101

现在我发送的一部分涉及计算需要传输的4个字节,我使用以下函数计算字节:

def convert_addr_with_flag(addr, flag):
    if(addr[0:1]!="0x"):
        # String does not have hex start, for representation
        addr = "0x" + addr
    # Convert String to int
    return binascii.unhexlify(str(hex(int(addr, 16) + (flag << 31))[2:].zfill(8)))  # Return the int value, bit shiffted with flag

但是,此函数将返回二进制字符串而不是ascii字符串。这是一个例子...... convert_addr_with_flag("00ACFF21", 1) # Output: b'\x80\xac\xff!'

我的问题是如何将此输出转换为可以添加到数据包的其他字节的表单。 e.g ..

part_1 = '\xaa\xaa' # 2 bytes
part_2 = '\x55\x55' # 2 bytes
part_3 = convert_addr_with_flag("00ACFF21", 1) # 4 bytes
full_packet = part_1 + part_2 + part_3 # Will not work, as part_3 is a binary string (b'\x80\xac\xff!)

这是我已经尝试过的, 使用decode("UTF-8)和UTF-16和ASCII。它无法理解字节串。 切片。使用[2]给我一个二进制字符,但不是第二个字节&#39;

非常感谢任何提示!

Python 3.4

1 个答案:

答案 0 :(得分:1)

decode无效,因为part_3没有ascii表示形式; ascii字符必须是介于0和127之间的int。看起来此示例中的part_3b'\x80\xac\xff!';前三个字节是128,172和255,其中没有一个是有效的ascii。

如果需要发送不在0到127之间的字节,则可能需要part_1part_2为字节字符串。