在Python中形成一个字节串

时间:2017-08-20 21:14:52

标签: python python-3.x escaping

我在Python中创建一个方法,它将采用一个数字,它将形成一个字节字符串,然后将其发送到Arduino。但是每当我尝试时,转义字符总是包含在最后的字节字符串中。

以下是我正在使用的代码片段:

num = 5
my_str = '\\x4' + str(num)
my_str.encode('utf-8')

结果:

b'\\x45'

我尝试了另一种方法:

num2 = 5
byte1 = b'\\x4'
byte2 = bytes(str(num2), 'ISO-8859-1')
new_byte = byte1 + byte2
new_byte

结果:

b'\\x45'

尝试以不同的方式:

num = 5
u = chr(92) + 'x4' + str(num)
u.encode('ISO-8859-1')

结果:

b'\\x45'

我想让字节字符串为b' \ x45'没有逃脱的角色,但不确定我错过了什么。我将非常感谢能够实现这一目标的任何指示。

2 个答案:

答案 0 :(得分:4)

你的问题是你已经逃过了反斜杠。不建议使用未知变量构造文字,特别是如果有更简单的方法,那就是:

def make_into_bytes(n):
    return bytes([64 + n])

print(make_into_bytes(5))

此输出

b'E'

请注意,这不是一个错误,因为这只是0x45的值:

>>> b'\x45'
b'E'

这个功能的工作方式基本上就是手工完成。前置' 4'到一个十六进制字符串(长度为1)与向它添加4 * 16相同,即64.然后我构造一个字节对象。请注意,我假设n是一个整数,就像在代码中一样。如果n应该是'a'之类的数字,那么这将是整数10

如果您希望它能够处理十六进制数字而不是整数数字,则需要将其更改为:

def make_into_bytes(n):
    return bytes([64 + int(n, 16)])

print(make_into_bytes('5'))
print(make_into_bytes('a'))

带输出

b'E'
b'J'

这非常简单地首先从基数16转换数字。

答案 1 :(得分:1)

您可以使用内置函数chr()将整数转换为相应的字符:

>>> chr(0x40 + 5)
'E'

或者,如果您只是一个获得字母表的第n个字母,那么使用str.ascii_uppercase

可能更具可读性
>>> string.ascii_uppercase[5 - 1]
'E'

请注意,此答案中的结果是Python 3中的字符串,而不是bytes个对象。只需在其上调用.encode()即可将其转换为bytes