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并使用了解码。这就成功了。