2011-07-04 180 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