2014-07-21 604 views
-1

我正在使用下面的方法對給定的文本進行編碼。使用ASCII解碼編碼文本

static long encodeText(String text) { 
    long l = 31; 
    for (int i = 0; i < text.length(); i++) { 
     l = l * 47 + text.getBytes()[i] % 97; 
    } 
    return l; 
} 

當我打電話上述方法作爲encodeText("stackoverflow"),返回編碼文本3818417496786881978

現在我想提供編碼文本並獲取字符串值。例如,如果我給3818417496786881978decodeText(long encoded),我需要輸出爲stackoverflow

static String decodeText(long encoded) { 
    String str = null; 
    // decode steps here 
    return str; 
} 

我該怎麼做?

+0

根據當前的「編碼」方案,這根本不起作用。如果你想實際加密某些東西,請使用真正的加密API。 (你在調用'text.getBytes()'方面沒有指定編碼等其他問題,等等......) –

+0

你的編碼的目的是什麼?它是加密嗎?如果是這樣,爲什麼不使用java支持的標準加密機制? –

+0

問題是您無法正確指定數字中的分隔符。如果所有的文字變成2位數字,那麼這是可能的。如果長度可變,那麼很可能無法解碼。 – EpicPandaForce

回答

0

通過邏輯思考:以7位ASCII表示時,明文「stackoverflow」表示13位7位(= 91位)信息。這超過了一個長(64位)可以容納。所以你的編碼會失去信息,使解碼變得不可能。

這應該是也相當從使用公式明顯:

l = l * 47 + text.getBytes()[i] % 97; 

對於你得到0和96之間的數(你已經在模信息丟失,減小信息97個可能接受字符的每個字符內(例如你不能在模數之後區分字節1和98),然後你將長字乘以小於97(47)的數字,所以兩個連續的字符將在信息分配方面重疊在密文中 最後,在添加更多字符之後,長整線溢出並且最高位簡單地丟失。

結論:如果你想再次解碼這些密文,請修復這三個地方的信息丟失。

+0

謝謝。我會試試:) – Greg

+0

'text.getBytes()'本身也可能是有損的。請使用'text.getBytes(「UTF-8」)'。 –