Python 3.x 有没有办法以字节为单位直接获取十六进制值,而不是获取字符串值?

Python 3.x 有没有办法以字节为单位直接获取十六进制值,而不是获取字符串值?,python-3.x,byte,Python 3.x,Byte,在python3.5中,我需要将字符串转换为UDP数据包支持的IPFIX字段值。当我以UDP数据包的形式发送字符串字节时,我无法再次恢复字符串数据。在Wireshark中,它说“格式错误的数据” 我发现IPFIX只支持字符串的“ASCII”。所以我将ASCII值转换成十六进制,然后转换成字节。但是在将十六进制(“4B”)转换为字节时。我不是以字节为单位获取十六进制值,而是以字节为单位获取字符串(“K”) 我在python控制台中尝试了以下内容。我需要输入的准确字节。但是看起来像是b'\x4B'而

在python3.5中,我需要将字符串转换为UDP数据包支持的IPFIX字段值。当我以UDP数据包的形式发送字符串字节时,我无法再次恢复字符串数据。在Wireshark中,它说“格式错误的数据”

我发现IPFIX只支持字符串的“ASCII”。所以我将ASCII值转换成十六进制,然后转换成字节。但是在将十六进制(“4B”)转换为字节时。我不是以字节为单位获取十六进制值,而是以字节为单位获取字符串(“K”)

我在python控制台中尝试了以下内容。我需要输入的准确字节。但是看起来像是b'\x4B'而不是'\x4B',我得到的是'K'。我正在使用python3.5

b'\x4B'

b'K'

代码:“K”。编码(“ascii”)

实际操作:b'K'


预期操作:b'\x4B'

有多种方法可实现此目的:

1.
hex
方法(python 3.5及更高版本) 2.使用
binascii
3.使用
str.format
4.使用
格式
注意:使用
格式的方法的性能效率不高

如果您真正关心
\x
,则必须使用
格式,例如:

>>> print(''.join('\\x{:02x}'.format(x) for x in 'K'.encode('ascii')))
\x4b
>>> print(''.join('\\x{:02x}'.format(x) for x in 'KK'.encode('ascii')))
\x4b\x4b
>>> ''.join('{:02X}'.format(x) for x in 'K'.encode('ascii'))
'4B'
>>> ''.join(format(x, '02X') for x in 'K'.encode('ascii'))
'4B'
如果您关心大写字母,则可以使用
X
而不是
X
,例如:

>>> print(''.join('\\x{:02x}'.format(x) for x in 'K'.encode('ascii')))
\x4b
>>> print(''.join('\\x{:02x}'.format(x) for x in 'KK'.encode('ascii')))
\x4b\x4b
>>> ''.join('{:02X}'.format(x) for x in 'K'.encode('ascii'))
'4B'
>>> ''.join(format(x, '02X') for x in 'K'.encode('ascii'))
'4B'
大写字母和带
\x

>>> print(''.join('\\x{:02X}'.format(x) for x in 'Hello'.encode('ascii')))
\x48\x65\x6C\x6C\x6F
如果您想要
字节
而不是
str
,则只需再次将输出编码为
ascii

>>> print(''.join('\\x{:02X}'.format(x) for x in 'Hello'.encode('ascii')).encode('ascii'))
b'\\x48\\x65\\x6C\\x6C\\x6F'

我在问题b'\\x48\\x65\\x6C\\x6C\\x6C\\x6F'我需要这样的东西b'\x48\x65\x6C\x6C\x6F'最后一个例子看,它实际上只有一个\,但它显示了两个\,因为反斜杠是一个转义字符,所以它需要转义是的,我在最终结果中只需要“\”这样做
r'abc\d'。编码('ascii')
在python控制台中,您将看到,即使使用原始字符串,单个反斜杠在编码后也将变为两个。或者甚至尝试
b'abc\d'
,即使您编写一个反斜杠,它的输出也将变为两个。因此,您不应该将
\x
添加到十六进制中,因为在这之后它不再是有效的十六进制。
\x
是just用于表示。您不能从
\x48\x65\x6C\x6C\x6F
返回
Hello
,您将需要
48656C6C6F
才能将其解码回
Hello
。此外,我认为在十六进制前加
0x
而不是
\x
,因此通常是
0x48656C6C6F
>>> print(''.join('\\x{:02X}'.format(x) for x in 'Hello'.encode('ascii')))
\x48\x65\x6C\x6C\x6F
>>> print(''.join('\\x{:02X}'.format(x) for x in 'Hello'.encode('ascii')).encode('ascii'))
b'\\x48\\x65\\x6C\\x6C\\x6F'