2013-09-22 139 views
0

你好,我正在使用AES程序,加密格式的輸出是一個bytearray。從一個字符串中,我給出十六進制爲bytearray

e37c1a5132a9a121d4fbb98ba42a684 

然而六角陣列應該是

e3 7c 1a 51 32 a9 a1 21 d4 fb b9 8b 0a 42 a6 84 

第四到最後一項是0A,但在連接字符串被顯示爲只是一個普通的一個。我如何檢測這個?

在下面的附加鏈接中,我試圖從第一次生成的鏈接到一個字節數組,但是當我錯過0中的0時,字符串崩潰。

http://laurentcharignon.com/blog/?p=37

+1

你是如何使字符串(缺少0(? –

+0

我不是專家,但你可以發送另外幾個字節作爲CRC校驗並丟棄錯誤的字節嗎? – zenpoy

+0

由於某種原因,我想我什麼時候運行它,這條線沒有執行,但是在加密的情況下,這條線保護它: if((data [i]&0xFF)<16) str = str +「0」+ java.lang .Integer.toHexString(data [i] &0xFF); –

回答

2

的問題是,在循環中,hex()函數結果不包括'0x'前綴之後,前導零的值小於16,所以hex(10)'0xa'hex(10)[2:]'a'(調用str()是不必要的)。因此,而不是:

result = "" 
for char in ciph: 
    result += str((hex(ord(char))))[2:] 

你可以儘量避免使用hex()像這樣的東西:

result = "" 
for char in ciph: 
    result += '%02x' % ord(char) 

稍微更簡潔的方式做同樣的事情會與發電機的表達:

result = ''.join('%02x' % ord(char) for char in ciph) 

可以在每個2字節十六進制值之間添加空格,並使用以下稍微不同的表達式來使結果更具可讀性:

 ' '.join('%02x' % ord(char) for char in ciph) 
2

這種缺少的信息是不可恢復的。你必須修復產生這個斷開的字符串的地方。用於生成上述字符串的另一個有效源字符串爲:

e3 7c 1a 51 32 a9 a1 21 d4 fb b9 8b a4 02 a6 84 

此處,0在稍後插入一個位置。在技​​術層面上,不可能推斷出哪些源字符串被用來產生零丟棄的上述十六進制表示。