2014-01-30 2145 views
1

我正在使用變量來存儲由套接字發送的數據。當我將它分配到我的程序中時,它可以工作,但是當我從文件中讀取它時,它被視爲字符串。Python十六進制變量賦值

實施例:

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. 
+0

如何將該數據保存到文件。另外,當你做'len(data)'時它說了什麼? –

+0

您似乎已經創建了包含6個字符而不是3個字節的文件。 –

+0

你**不應該**使用它,但'print(eval(「'」+ data +「'」))'會做到這一點。 – Sinkingpoint

回答

2

在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)。

如果不知何故沒有上面的是你真正想要什麼,你只是想弄清楚如何將字符串轉換像r'\x31\x32\x33'在Python '123',這裏是你如何能做到這一點:

>>> r'\x31\x32\x33'.decode('string_escape') 
'123' 

或者在Python 3中。X:

>>> br'\x31\x32\x33'.decode('unicode_escape') 
'123' 

編輯:基於評論它看起來像你實際上得到十六進制字符串像'313233',像一個字符串轉換爲'123'您可以用十六進制解碼:

>>> '313233'.decode('hex') 
'123' 

或者在Python 3.x上:

>>> bytes.fromhex('313233').decode('utf-8') 
'123' 
+0

謝謝!我可以控制如何格式化文件,所以我刪除了所有的\ x和使用的解碼。那就是訣竅。 – user3254700

0

是,當你從字符串爲int轉換,可以指定的基字符串中的數字:

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

>>> chr(49) 
'1' 

所以,你應該能夠將十六進制值解析出你的文件並單獨將它們轉換爲字符。

+0

單步轉換不起作用。只需在分配後打印出x,就會看到字符串'123AU'。將它拆分爲不會出現的子字符串將生成僅包含原始字符串的列表。 – krait

+0

是的,如果你分配與x = r「\ x31 \ x32 \ x33 \ x41 \ x55」這相當於他正在讀的內容,這不起作用 – jbh

0

如前所述你正在做後期處理,它會更容易處理,如果文本爲「313233」 ,那麼你將能夠使用

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

正如在評論這是Python 2.7版指出,並在3.3中棄用。但是,除非這個問題被錯誤標記,否則這將起作用。

+0

decode('hex')在Python3上被棄用和刪除 – JBernardo

+0

他呼籲他在標籤中使用python 2.7 – jbh

0

我可能會在這裏違反了許多編程標準,但下面的代碼適用於特定情況

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