2015-07-01 2 views
-1

Здесь мой код в С.Генерация CRC в Java и C

unsigned int crc32b(unsigned char *message) { 
    int i, j; 
    unsigned int byte, crc, mask; 

    i = 0; 
    crc = 0xFFFFFFFF; 
    while (message[i] != 0) { 
     byte = message[i];   // Get next byte. 
     crc = crc^byte; 
     for (j = 7; j >= 0; j--) { // Do eight times. 
     mask = -(crc & 1); 
     crc = (crc >> 1)^(0xEDB88320 & mask); 
     } 
     i = i + 1; 
    } 
    return ~crc; 
} 

Но в Java, unsign ИНТ не поддерживается. поэтому я пытаюсь получить unsign по & 0xFFFFFF

Но и это неправильно. Как исправить это в java

+1

Показать код на Java и мы можем вам помочь;) – moffeltje

+0

Это может помочь: http://stackoverflow.com/questions/25723365/calculate-crc32b-in-java – mike

ответ

1

Вы можете легко эмулировать большинство беззнаковых арифметических чисел со знаками целых чисел в Java (некоторые вещи более раздражают, например, деление, но оно здесь не используется).

Это, в частности, очень легко, 0xFFFFFFFF - это само по себе, также известное как -1.

>> следует заменить на его неподписанный аналог, >>>.

И сообщение byte из сообщения должно быть замаскировано для отмены расширения знака.

В общей сложности (не тестировалось)

int crc32b(byte[] message) { 
    int i, j; 
    int b, crc, mask; 

    i = 0; 
    crc = -1; 
    while (i < message.length) { 
     b = message[i] & 0xFF;  // Get next byte. 
     crc = crc^b; 
     for (j = 7; j >= 0; j--) { // Do eight times. 
     mask = -(crc & 1); 
     crc = (crc >>> 1)^(0xEDB88320 & mask); 
     } 
     i = i + 1; 
    } 
    return ~crc; 
} 

Это все еще довольно C-иш хотя.