Python 2.7 Python十六进制变量赋值

Python 2.7 Python十六进制变量赋值,python-2.7,Python 2.7,我使用一个变量来存储套接字发送的数据。当我在程序中分配它时,它工作,但当我从文件中读取它时,它被视为字符串 例如: data = '\x31\x32\x33' print data 输出 123 # <--- this is the result I want when I read from a file to assign data f = open('datafile') <--- datafile contains \x31\x32\x33 on one lin

我使用一个变量来存储套接字发送的数据。当我在程序中分配它时,它工作,但当我从文件中读取它时,它被视为字符串

例如:

data = '\x31\x32\x33'

print data
输出

123   # <--- this is the result I want when I read from a file to assign data


f = open('datafile')  <--- datafile contains \x31\x32\x33 on one line

data = f.readline()

print data
\x31\x32\x33  # <--- wanted it to print 123, not \x31\x32\x33. 

123#是,当您将字符串转换为int时,可以指定字符串中数字的基数:

>>> print int("31", 16)
49

>>> chr(49)
'1'

因此,您应该能够从文件中解析十六进制值,并将它们单独转换为字符。

正如您所说的,如果文本是“313233”,则处理起来会更容易 然后您就可以使用

data = "313233"    
print data.decode("hex") # this will print '123'

如注释中所述,这是针对Python2.7的,在3.3中不推荐使用。但是,除非这个问题被错误标记,否则这将起作用。

我可能在这里违反了许多编程标准,但是下面的代码适用于给定的情况

with open('datafile') as f:
    data=f.read()
data=data.lstrip('\\x') #strips the leftmost '\x' so that now string 'data' contains numbers saperated by '\x'
data=data.strip().split('\\x') #now data contains list of numbers
s=''
for d in data:
    s+=chr(int(d,16)) #this converts hex ascii values to respective characters and concatenate to 's'
print s

在Python中,字符串
'\x31\x32\x33'
实际上只有三个字符
'\x31'
是序号为0x31(49)的字符,因此
'\x31'
相当于
'1'
。听起来您的文件实际上包含12个字符
\x31\x32\x33
,这相当于Python字符串
'\\x31\\x32\\x33'
,其中转义的反斜杠表示单个反斜杠字符(也可以用原始字符串文本
r'\x31\x32\x33'
表示)

如果您确实确定该数据应该是
'123'
,那么您需要查看该文件是如何编写的。如果这是您可以控制的,那么您应该在那里对其进行寻址,这样您就不会得到由代表十六进制转义的几个字节组成的数据

还有一种可能是,无论编写此数据的是什么,都已经在使用某种数据交换格式(类似于JSON),在这种情况下,您不需要更改数据的编写方式,只需要使用该数据交换格式的解码器(如
JSON.loads()
,但这不是JSON)

如果以上两项都不是您真正想要的,并且您只想知道如何在Python中将类似
r'\x31\x32\x33'
的字符串转换为
'123'
,下面是您的方法:

>>> r'\x31\x32\x33'.decode('string_escape')
'123'
或者在Python 3.x中:

>>> br'\x31\x32\x33'.decode('unicode_escape')
'123'
>>> bytes.fromhex('313233').decode('utf-8')
'123'
编辑:根据评论,看起来您实际上得到了十六进制字符串,如
'313233'
,要将这样的字符串转换为
'123'
,您可以使用十六进制进行解码:

>>> '313233'.decode('hex')
'123'
或者在Python 3.x上:

>>> br'\x31\x32\x33'.decode('unicode_escape')
'123'
>>> bytes.fromhex('313233').decode('utf-8')
'123'

如何将数据保存到文件中。另外,当您执行
len(data)
时,它会说什么?您似乎已经创建了包含6个字符的文件,而不是您预期的3个字节。您不应该使用它,但是
print(eval(“““+data+”””)
会这样做。数据来自wireshark导出,作为类似char peer0_0[]={0x10,0x00,0x0b}的C数组。我正在将其清理为python“\x10\x00\x0b”的格式,该格式在我的第一个示例中有效,但我希望在读取文件时得到相同的结果。尝试通过使用print显示示例来简化。当我在s.send(data)中使用它时,在第一个示例中,它发送十六进制字节313233,这是我想要的,在第二个示例中,它发送5C7833315C7833325C783333一步转换不起作用。分配完x后,只需打印出x,就会看到字符串“123AU”。在不出现的子字符串上拆分它将生成一个只包含原始字符串的列表。是的,如果您使用x=r“\x31\x32\x33\x41\x55”进行赋值,这与他正在阅读的内容等效,这不起作用。他说他在标记库中使用的是python 2.7!我可以控制文件的格式,所以我去掉了所有的\x并使用了解码。这就成功了。