有什么方法可以获取以字节为单位的直接十六进制值,而不是获取字符串值?

时间:2019-03-27 04:52:03

标签: python-3.x byte

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

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

我在python控制台中尝试了以下方法。我需要输入的确切字节。但是好像b'\ x4B'而不是'\ x4B'我正在得到'K'。我正在使用python3.5

  

b'\ x4B'

     

b'K'

代码:“ K” .encode(“ ascii”)

实际操作数:b'K'

期望的OP:b'\ x4B'

1 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点:

1。 hex方法(python 3.5及更高版本)

>>> 'K'.encode('ascii').hex()
'4b'  # type str

2。使用binascii

>>> binascii.hexlify('K'.encode('ascii'))
b'4b'  # type bytes

3。使用str.format

>>> ''.join('{:02x}'.format(x) for x in 'K'.encode('ascii'))
'4b'  # type str

4。使用format

>>> ''.join(format(x, '02x') for x in 'K'.encode('ascii'))
'4b'  # type str

注意:使用format的方法的性能不是很有效。

如果您真的关心\x,则必须使用format,例如:

>>> 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

如果您关心大写字母,则可以使用X代替x,例如:

>>> ''.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

如果您希望使用bytes而不是str,则只需将输出再次编码为ascii

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