2015-10-27 64 views
0

對於密碼學應用程序,我正在讀取表示十六進制(「36E06921」,「27EA3C74」)的字符串,並且需要將它們異或並返回一個結果str ( 「110A5555」)。我能夠通過字符異或char來獲得小數結果,但是在得到結果的ascii表示法時遇到問題。所以,0x3 xor 0x3 = 0x0。什麼是最好的方法來獲得值0到ASCII值0x30?十六進制數字(0-15)並返回ASCII表示

在執行當前的嘗試:

def xor_hexstrings(xs, ys): 
    bin_x = binascii.unhexlify(xs) 
    bin_y = binascii.unhexlify(ys) 
    hex_str = "" 
    for x,y in zip(xs, ys):   
     # fails, with error TypeError: 'int' does not support the buffer interface 
     xored = binascii.b2a_hex(int(x, 16)^int(y, 16)) 
     hex_str += xored 
return None 

編輯:關閉,唯一的問題是零。以下示例顯示推薦的解決方案返回零的空字符串。

>>> hex(int('0', 16)).lstrip("0x") 
'' 
>>> hex(int('1', 16)).lstrip("0x") 
+0

你不能只對XOR單個字符進行異或,因爲它們並不全都在連續的範圍內。您需要將十六進制轉換爲int,xor,然後再將int轉換爲十六進制。 –

+0

示例添加顯示即時通訊不只是xoring ascii值。 –

+0

要將每個數字轉換回十六進制,只需使用'hex(digit)'並在開始處去掉'0x'。 –

回答

-1

我想你在這裏問的是將一個整數轉換成它的各自的字符串表示。至少這就是示例0x0 - > 0x30似乎表明的意思。如果是這樣,只需使用str()函數將其轉換爲Python中的字符串即可。

>>> ord(str(0)) 
48 

僅供參考48等於的0x30和ord()功能爲您提供了一個字符的整數表示。編輯: 檢查格式化功能。似乎有預期的行爲!

>>> format(0x0, 'x') 
'0' 
+1

適用於純十進制數字,但不適用於十六進制。 –

+0

這似乎接近我想要的,但說我有XOR結果是13,在十六進制0xD。類似的東西能夠處理這個嗎? –

+0

因此給出int 13,你想要十六進制0xD?你可以做十六進制(13) – Gil

0

我猜你需要這樣的:

>>> base10_int = int('0x0',16) 
>>> base10_int_str = str(base10_int) 
>>> base10_ascii_val = ord(base10_int_str) 
>>> hex_ascii_val = hex(base10_ascii_val) 
>>> hex_ascii_val 
'0x30' 
2

你可以做到以下幾點:

x = "36E06921" 
y = "27EA3C74" 
z = ''.join([format((int(i,16)^int(j,16)),'X') for i,j in zip(x,y)]) 
print z 

輸出:

110A5555 
+0

如果使用格式化字符串'',則不需要'upper()' X'(大寫)而不是「x」(小寫)。 –

0

在Python 3中調整模式Python 2上可用的類型:使用像字節一樣對象,以得到自然int迭代:

import binascii 
from operator import xor 

def xor_hex(xs, ys): 
    xs = bytearray(binascii.unhexlify(xs)) 
    ys = bytearray(binascii.unhexlify(ys)) 
    return binascii.hexlify(bytearray(map(xor, xs, ys))) # Stick a .upper() on this if it must produce uppercase hex 

>>> print xor_hex("36E06921", "27EA3C74") 
110a5555 

在Python 3,它更簡單,因爲你可以直接使用,而不是從的Py2 str轉換爲bytearraybytes類型得到bytes般的行爲:

def xor_hex(xs, ys): 
    xs = binascii.unhexlify(xs) 
    ys = binascii.unhexlify(ys) 
    return binascii.hexlify(bytes(map(xor, xs, ys))) 

儘管與Python 3的int.to_bytesint.from_bytes方法(無可否認會生成更加醜陋的代碼)相比,它的速度相當慢。