2015-12-06 2 views
0

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

Функция впервые описана следующим образом до быть предусмотрена функция в C:

Initialise the checksum as FFFF(hex). 
For each byte 
    Checksum = Checksum XOR (current Byte) 
    For I = 0 to 7 
     If ((Checksum AND 1)=0) 
      Checksum = Right_Bit_Shift Checksum 1 bit 
     Else 
      Checksum = (Right_Bit_Shift Checksum 1 bit) XOR A001(hex) 
     Next I 
    Next Byte 

Вот пример, приведенный написан на C:

/* 
*Routine CRC takes a data string (data) "length" long and * 
* * returns the checksum value 
* 
*NOTE WORD = unsigned short int 
*  BYTE = unsigned char 
*/ 

WORD CRC(BYTE *data, WORD length) 
{ 
    WORD sum = 65535; /*Checksum value initialised to FFFFhex */ 
    while (length-- > 0) 
    { 
     sum = ByteCRC(sum, *data++); 
    } 
    return sum; 
} 

WORD ByteCRC(WORD sum, BYTE data) 
{ 
    WORD i; /* Loop counter */ 
    sum = sum^(WORD)data; 
    for (i=0; i<8; i++) 
    { 
     if ((sum&1) == 0) 
      sum = sum>>1 
     else 
      sum = (sum >> 1)^0xA001; 
    } 
    return sum; 
} 

Сейчас я в настоящее время зачислен в средний класс Java в школе. С учетом сказанного некоторые части этих функций я понимаю. Но, как я уже говорил, я все еще не полностью понимаю некоторые аспекты манипуляции бит, чтобы написать эти функции в формате Lua. Я пытаюсь воссоздать его сам в Lua, но не верю, что я прав или близко. К сожалению, я не понимаю желаемого эффекта достаточно, чтобы даже попробовать проверить это. Вот что я пытался написать сам на основе информации, предоставленной:

Function CRC(data, length) 
    sum = 65535 
    while length > 0 do 
     sum = ByteCRC(sum, data=data+1) 
     length = length - 1 
    end 
return sum 
end 

Function ByteCRC(sum, data) 
    sum = sum ~ data 
    for i = 0, 8 do 
     if ((sum & 1) = 0) 
      sum = sum >> 1 
     else 
      sum = (sum >> 1) ~ string.char(0xA001) 
     end 
    end 
    return sum 
end 

Любой критикуя и дальнейшая помощь, помогая мне в А) написать это лучше и B) найти какие-либо ошибки в моем переводе это то, что я м ищет.

+0

Что вы хотите сказать? – this

+0

@this Я добавил requrest, чтобы иметь предоставленные функции, написанные аналогичным образом в Lua. – Pwrcdr87

+0

SO не является кодовым письмом. Представьте конкретную проблему, пожалуйста. – this

ответ

2

Поскольку у lua есть бит операции, это та же основная концепция. Здесь, как это происходит, с некоторыми комментариями кода:

function CRC(data, length) 
    sum = 65535 
    local d 
    for i = 1, length do 
     d = string.byte(data, i) -- get i-th element, like data[i] in C 
     sum = ByteCRC(sum, d) 
    end 
    return sum 
end 

function ByteCRC(sum, data) 
    sum = sum ~ data 
    for i = 0, 7 do  -- lua for loop includes upper bound, so 7, not 8 
     if ((sum & 1) == 0) then 
      sum = sum >> 1 
     else 
      sum = (sum >> 1) ~ 0xA001 -- it is integer, no need for string func 
     end 
    end 
    return sum 
end 

print(CRC("foo", 3)); 
+0

Благодарю вас за ваш пример. Заметки помогают мне понять метод вашего безумия! В строке 4 вашего примера: 'для i = 1, length do' было бы нормально изменить функцию, чтобы принимать аргумент' data', и изменить эту строку на 'для i = 1, #data do'?Таким образом, мне не нужно беспокоиться о длине данных, поступающих в функцию? – Pwrcdr87

+0

Да, и 'string.len', и' # 'будут делать все отлично. – keltar

+0

отличная почта. Я ценю вашу помощь. Как я уже упоминал ранее, я должен был добавить свою версию кода в свой первоначальный пост, поэтому я не отрывался, просто прося, чтобы код был написан для меня членами этого сайта. Я также лично счастлив, что смог получить примерно 80% от правильного перевода, основываясь на том, что я узнал на Java и Lua. Я могу сохранить некоторую информацию! Но ваша тонкая настройка кода поможет мне лучше понять, почему и как мне лучше выполнять бинарные манипуляции, чего я действительно хочу сделать. – Pwrcdr87

Смежные вопросы