2014-12-07 9 views
-3

Я пытаюсь перевести код этого питона на Java, но я не могу понять строки:Не могу понять код python. Попробуйте перевести на Java

crc^ord (data[idx]) << 8 

и

return crc & 0xffff 

Actualy, я не могу понять только часть с < и & 0xffff

Полная функция:

def calculateCRC (data): 
l = len (data) 
crc = 0 
idx = 0 
l = l - 1 
while l >= 0 : 
    crc = crc^ord (data[idx]) << 8 
    idx = idx + 1 
    i = 8 
    while i != 0: 
    if crc & 0x8000: 
     crc = crc << 1^0x1021 
    else: 
     crc = crc << 1 
    i = i - 1 
l = l - 1 

return crc & 0xffff 

Я знаю, что SO - бесплатный бесплатный перевод кода, но у меня есть четкий вопрос о python. So. Вы можете мне помочь?

+0

алмас шайх имеет свой перевод, но в случае, если вы столкнулись с проблемами производительности с расчетом CRC битого на-время, есть байты-в-а-типа алгоритм для любого вкуса КПР. Этот метод, по-видимому, связан с Aram Perez, в статье IEEE Micro 1983 «Байт-расчеты CRC». PDF-файлы повсюду. Я нашел его на http://bitsavers.informatik.uni-stuttgart.de/pdf/fairchild/_appNotes/Byte-wise_CRC_Jun83.pdf –

+0

По-видимому, метод возвращается немного дальше, чем в статью за июнь '83. По-видимому, Джон Р. Хилл опубликовал табличный подход в 1979 году. Однако я не могу найти (бесплатный) PDF этого онлайн. –

ответ

0

Спасибо за помощь! Полный ответ:

public int getCRC(String data) 
{ 
    int l = data.length(); 
    int crc = 0; 
    int idx = 0; 
    l = l - 1; 
    while (l >= 0) 
    { 
     crc = crc^data.charAt(idx) << 8; 
     idx = idx + 1; 
     int i = 8; 
     while (i != 0) 
     { 
      if ((crc & 0x8000) != 0) 
      { 
       crc = crc << 1^0x1021; 
      } 
      else 
      { 
       crc = crc << 1; 
      } 
      i = i - 1; 
     } 
     l = l - 1; 
    } 
return crc & 0xffff; 
} 
3

См. this для получения подробной информации о функции ord. Java-эквивалент crc^ord (data[idx]) << 8 будет

crc^data.charAt(idx) << 8; 
Смежные вопросы