Python 将十六进制表示转换为字节对象

Python 将十六进制表示转换为字节对象,python,byte,Python,Byte,我是Python的初学者。 我有一个字符串是“544553543030303030303031”,长度是24。我想将其转换为长度为12的字节,如b'\x54\x45\x53\x54\x30\x30\x30\x30\x30\x31'。有人能帮我吗 hex_string2 = "TEST00000001" output = ''.join(hex(ord(c))[2:] for c in hex_string2) byte_data = bytes(output, 'ascii'

我是Python的初学者。 我有一个字符串是“544553543030303030303031”,长度是24。我想将其转换为长度为12的字节,如b'\x54\x45\x53\x54\x30\x30\x30\x30\x30\x31'。有人能帮我吗

hex_string2 = "TEST00000001"
output = ''.join(hex(ord(c))[2:] for c in hex_string2)
byte_data = bytes(output, 'ascii')
print(byte_data) #/ b'544553543030303030303031'
print(len(byte_data)) #24

它应该是12个字节,而不是24个。

一个字节就是一个字节,不管架构如何。 就我无法重现您的问题而言,我看到了:

>>> hex_string2 = "TEST00000001"
>>> byte_data = bytes(hex_string2, 'ascii')
>>> print(byte_data) #/ b'544553543030303030303031'
b'TEST00000001'
>>> print(len(byte_data)) #24
12
如上所述,一切正常。 在您的原始帖子中,您是否有一个不同的变量,您正在引用和设置之前的变量(即变量输出)

因为如果你这样做:

>>> hex_string2.encode("hex")
'544553543030303030303031'
现在如果你想要一个两位小数的列表,那么

>>> [this.encode("hex") for this in byte_data]
['54', '45', '53', '54', '30', '30', '30', '30', '30', '30', '30', '31']

这是您试图获取的内容吗?

要在Python中将字符串转换为字节,请直接在字符串上使用
bytes
。不要在字符上调用
ord
hex

hex_string2 = "TEST00000001"
byte_data = bytes(hex_string2, 'ascii')
print(len(byte_data))
# 12
并且输出确实与
b'\x54\x45\x53\x54\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x31'
相同:

byte_data == b'\x54\x45\x53\x54\x30\x30\x30\x30\x30\x30\x30\x31'
# True

相反,如果您的输入是填充十六进制表示形式的字节字符串,则需要对该表示形式进行解码(例如,使用
binascii
):

编解码器

import codecs
codecs.decode('544553543030303030303031', 'hex')
# b'TEST00000001'

展示你的尝试。这里有一组明显的字符对-所以用它来解决问题。@aneroid我编辑了这篇文章。什么是
hex\u string2
?您使用了
输出
,但未指定其初始值。@很抱歉,我在复制代码时出错了。现在修复你的问题说
我有一个字符串是“544553543030303033031”
,然后你把
hex\u string2=“TEST00000001”
放在代码中:-/这不再起作用了:
str.decode('hex')
仅是Python 2。是的,没错,我在前面的示例中测试了这两种行为,并在python2上留下了提示,但是上面提到的(即使用bytes())的一般想法是正确的。我将编辑回复以反映版本。
import binascii
binascii.unhexlify(b'544553543030303030303031')
# b'TEST00000001'
import codecs
codecs.decode('544553543030303030303031', 'hex')
# b'TEST00000001'