在Python中形成字节字符串

在Python中形成字节字符串,python,python-3.x,escaping,Python,Python 3.x,Escaping,我正在用Python创建一个方法,它将采用一个数字,该数字将形成一个字节字符串,然后发送到Arduino。但是,每当我尝试时,转义字符总是包含在最后一个字节字符串中 以下是我正在使用的代码片段: num = 5 my_str = '\\x4' + str(num) my_str.encode('utf-8') 结果: b'\\x45' b'\\x45' b'\\x45' 我尝试了另一种方法: num2 = 5 byte1 = b'\\x4' byte2 = bytes(str(num2)

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

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

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

b'\\x45'
b'\\x45'
b'\\x45'
我尝试了另一种方法:

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

b'\\x45'
b'\\x45'
b'\\x45'
以另一种方式尝试:

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

b'\\x45'
b'\\x45'
b'\\x45'

我想将字节字符串设置为b'\x45',不带转义字符,但不确定我遗漏了什么。如果有人能给我指点如何做到这一点,我将不胜感激。

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

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

print(make_into_bytes(5))
这个输出

b'E'
请注意,这不是错误,因为这只是0x45的值:

>>> b'\x45'
b'E'
这个功能的工作方式基本上就是手工操作。在十六进制字符串(长度为1)前面加上“4”与在其中加上4*16相同,即64。然后我用它构造了一个bytes对象。注意,我假设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转换为基数。

您的问题是您已经跳过了反斜杠。不建议使用未知变量构造文本,特别是如果有一种更简单的方法,即:

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

print(make_into_bytes(5))
这个输出

b'E'
请注意,这不是错误,因为这只是0x45的值:

>>> b'\x45'
b'E'
这个功能的工作方式基本上就是手工操作。在十六进制字符串(长度为1)前面加上“4”与在其中加上4*16相同,即64。然后我用它构造了一个bytes对象。注意,我假设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转换为数字。

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

>>> chr(0x40 + 5)
'E'
或者,如果您只需要一个字符就可以获得字母表的第n个字母,那么使用
str.ascii_大写字母可能更容易阅读

>>> string.ascii_uppercase[5 - 1]
'E'

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

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

>>> chr(0x40 + 5)
'E'
或者,如果您只需要一个字符就可以获得字母表的第n个字母,那么使用
str.ascii_大写字母可能更容易阅读

>>> string.ascii_uppercase[5 - 1]
'E'

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

是否
num
始终是介于0和9之间的数字?它也可以是一个表示十六进制数字的字符串,如
“a”
“f”
num2=5
b=chr(ord('\x40')+num2)
hex(ord(b))
->
0x45'
num
是否总是一个介于0和9之间的数字?它也可以是一个表示十六进制数字的字符串,如
“a”
“f”
num2=5
b=chr(ord('\x40')+num2)
十六进制(ord(b))
->
'0x45'
。这不是一个字节object@IzaakvanDongen我知道它不是,但是把它转换成一个是微不足道的。我回答了OP难以回答的问题,但我会明确指出。这不是一个字节object@IzaakvanDongen我知道它不是,但是把它转换成一个是微不足道的。我回答了OP难以回答的部分问题,但我会明确指出。关于“使用未知变量构造文本非常困难”,这是不正确的。这很简单,但不是解决此问题的推荐方法。为了实现这一点,您可以使用
编解码器。解码(\\x45”,“unicode\u转义”)
来解析包含转义的字符串。这一点很好!谢谢,我会修改我的答案。另外,如果我早些时候听起来直言不讳,我也很抱歉。我不是有意的。关于“使用未知变量构造文本非常困难”——这不是真的。这很简单,但不是解决此问题的推荐方法。为了实现这一点,您可以使用
编解码器。解码(\\x45”,“unicode\u转义”)
来解析包含转义的字符串。这一点很好!谢谢,我会修改我的答案。另外,如果我早些时候听起来直言不讳,我也很抱歉。我不是故意的。