2013-04-03 2 views
0

Недавно я переношу заявку на tomcat5 с 32-битной java на tomcat6 с 64-битной java.CRC32 java отличается на java 64 бит

В приложении есть текстовый калькулятор CRC, который возвращает разные значения на каждом из серверов. Например: "гипоплазия дель Сено frontal.Resto де senos faciales против Desarrollo у neumatización habituales.No себе observan lesiones óseas.Atentamente," возвращается: 439231721 на 32 битных Jvm и возвращает: 2756208468 на 64 битной виртуальной машине Java

также попробовал его на 32 битном Jvm tomcat6 и возвращает 439231721

Вот код КРК расчета:

public static long doChecksum(String text) { 

    try{ 

    //Convert string to bytes 
    byte bytes[] = text.getBytes(); 
    Checksum checksum = new CRC32(); 
    // void update(bytes[] b, int start, int length) 
    checksum.update(bytes,0,bytes.length); 

    long lngChecksum = checksum.getValue(); 
      System.out.println(text + " : " + lngChecksum); 
      return lngChecksum; 
     } catch (Exception e) { 
     return -1; 
     } 
} 

Спасибо!

+0

Вы уверены, что это не проблема локаль? – us2012

+3

Вы проверили, являются ли содержимое «байтов» одинаковыми или разными на обеих платформах? Обратите внимание, что 'getBytes()' на 'String' переводит символы, используя кодировку по умолчанию для системы. Скорее всего, системы имеют разные кодировки символов по умолчанию. – Jesper

ответ

3

Обратите внимание, что String.getBytes() переводит символы в байты, используя кодировку по умолчанию для системы. Если у систем разные кодировки символов по умолчанию, вы получаете разные байтовые массивы, что приводит к различным контрольным суммам.

Укажите кодировку, которую вы хотите использовать, чтобы получить устойчивые результаты:

byte[] bytes = text.getBytes("UTF-8");