2011-07-04 78 views
0

我一直堅持這幾天,現在似乎無法得到它。我希望通過張貼在這裏,我會有一個頓悟,併發布後30秒解決這個問題! :D 這裏去...黑莓CRC32問題

我需要加密一個字符串,將它附加到我的URL,並將其發送到服務器。步驟如下:

1. Build the string (for this post, I'm using a constant TEST string) 
2. Get a CRC of the string and add that to the front of the string. 
3. HEX the whole string. 
4. Append to URL and connect over HTTP 

我被困在2!我應該得到的CRC是1903129755,但除其他結果外,我得到-1903129756。注:爲了這篇文章的目的,我使用了一個測試字符串及其產生的CRC。字符串會隨着構建時的毫秒數而改變。

我也要指出,這是在黑莓上。 Android代碼完美。該CRC來自Android和在線CRC生成器網站: http://hash.online-convert.com/crc32b-generator

代碼我似乎爲別人工作,所以我顯然在這裏的錯。有人可以發現我的錯誤?由於

正如你所看到的,我已經嘗試了幾種不同的方式:

import net.rim.device.api.util.CRC32; 

    public long getCrcValue(String inputText) 
    { 
      int crc1 = 0,crc2=0; 
      long crc3=0; 

      crc1 = CRC32.update(CRC32.INITIAL_VALUE, inputText.getBytes()); 
      crc2 = CRC32.update(0, inputText.getBytes()); 
      String temp = Integer.toBinaryString(crc1); 
      crc3 = Long.parseLong(temp,2); 
      long crc4 = CRC32.update(CRC32.INITIAL_VALUE, inputText.getBytes()); 
      long crc5 = CRC32.update(0, inputText.getBytes()); 


      logger.log("CRC1 is: "+crc1); 
      logger.log("CRC2 is: "+crc2); 
      logger.log("CRC3 is: "+crc3); 
      logger.log("CRC4 is: "+crc4); 
      logger.log("CRC5 is: "+crc5); 

return crc1; 
} 

PS logger是我自己的類來定製的格式輸出到控制檯輸出,所以忽略它。

編輯:說到輸出,這裏的輸出是什麼:

CRC1 is: -1903129756 
CRC2 is: -460833676 
CRC3 is: 2391837540 
CRC4 is: -1903129756 
CRC5 is: -460833676 

EDIT2:這裏是相當於Android的代碼。 注意crc被定義爲CRC32 crc

public long getCrcValue(String inputText) 
{ 
    crc.reset(); 
    crc.update(inputText.getBytes()); 
    return crc.getValue(); 
} 
+0

什麼是您使用的等效Android代碼? –

+0

出於某種原因,您的輸出CRC與您期望值的位反比,所以除非您找到解決方案,否則您可能只是反轉輸出 – Hasturkun

+0

我很好奇你爲什麼要調用這個「加密」字符串。 CRC32沒有密碼強度。即使這樣做,將校驗和預先加到字符串上,十六進制編碼整個事物也沒有密碼強度。 – Richard

回答

1

僅供參考, 最終,我通過從java.util.zip.CRC32java.util.zip.checksum獲取源,並在使用該源的黑莓項目中創建新類。因爲這是Android使用的相同實現,所以這兩個應用程序都可以正常工作!

1

這是應該的:

int crc32 = CRC32.update(CRC32.INITIAL_VALUE, inputText.getBytes())^0xffffffff; 
+0

工程謝謝!奇怪的是,CRC32.INITIAL_VALUE等於0XFFFFFFFF!我以前從未使用過'^'。有人可以解釋它的用途嗎?我在猜測某種二進制乘法? – eoinzy

+0

對不起。我應該指出,這個例子CRC只是一個測試。 CRC將會不斷變化,因爲我將時間以毫秒爲單位。雖然這適用於這一個CRC,但它不適用於其他CRC,我仍然在收到負面的CRC。我使用CRC32.update()錯誤? – eoinzy

+0

@eoinzy:對於一個32位值'^'(XOR)'0xffffffff'與NOT – Hasturkun

0
String temp = Integer.toBinaryString(crc1); 
crc3 = Long.parseLong(temp,2); 

題外話,但在地球上那是什麼?你想要做'長crc3 = crc1;'最難的方法?

+0

相同我將CRC轉換爲二進制,因爲我認爲問題的根源在於第一個數字是8位二進制int(10101010)表示簽名(+/-),因此將其轉換爲二進制將爲0000000010101010,因此前導數字始終爲0。請記住,當我認爲本應該是正面的時候,我一直得到一個負數。我想現在它明顯是二元數學,我是一個新手! – eoinzy