LINUX.ORG.RU

Помогите пожалуйста перевести программу с с++ на python

 , ,


0

1

Есть простая программка на С++. вычисляет CRC. Нужна помощь в переводе ее на Python 2.7 Ниже текст:

// функция рассчитывает контрольную сумму
// последовательности байтов и возвращает результат.
// *InputData - указатель на последовательность байтов.
// BytesNumber - количество байтов,
// для которых считается контрольная сумма.
// Offset - смещение относительно начала последовательности
// байтов, с которого начинает считаться контрольная сумма
// (0 - без смещения).
// Возвращает контрольную сумму.
unsigned char
CrcMaker(unsigned char *InputData, unsigned char BytesNumber, unsigned char Offset)
{
        // Служебные параметры.
        register unsigned char i, j, Data, CrcCode = 0, Polinom = 0x69;

        for (i = Offset; i < BytesNumber + Offset; i++) {
                Data = InputData[i];
                for (j = 0; j < 8; j++) {
                        if  (CrcCode & (1 << 7)) {
                                CrcCode *= 2;
                                if (Data & (1 << 7))
                                        CrcCode ++;
                                CrcCode ^= Polinom;
                        } else { // if (CrcCode & (1 << 7))
                                CrcCode *= 2;
                                if (Data & (1 << 7))
                                        CrcCode ++;
                        } // if (CrcCode & (1 << 7))
                        Data *= 2;
                } // for (j = 0; j < 8; j++)
        } // for (i = Offset; i < BytesNumber + Offset; i++)

        // Вернѐм контрольную сумму.
        return CrcCode;
} // unsigned char ucCrcMaker ( ... )
//~~~~~~~~~~~~~~~~~~~~~~~~~~
Спасибо.



Последнее исправление: beastie (всего исправлений: 4)

import crc

Как-то так. Зачем переписывать то, что с вероятностью в 146% уже есть готовое. (И может быть даже в стандартной библиотеке.)

beastie ★★★★★
()

Что конкретно у тебя не получилось?

blackst0ne ★★★★★
()

Ну так в чем проблемы? Сторонних либ там не используется, только переменные и действия с ними. Зайди на сайт Питона и посмотри маны, за пару мин можно переписать.

daniilArch ★★
()

Хорошо. Попробую разобраться с вашей помощью.
Как понимать строку unsigned char *InputData ?
Что значит * ?

bestbat
() автор топика
Ответ на: комментарий от bestbat

Что значит * ?

Первая ссылка в выдаче гугла по фразе «указатель си» http://cppstudio.com/post/5828/

Почему такая фраза? Потому что у тебя выше в комментарии написано:

// *InputData - указатель на последовательность байтов.

//Тебе нужно занть си и понимать что делает эта функция, перед тем как делать аналог на python.

shrub ★★★★★
()

Ты хочешь, чтобы мы за тебя что-то сделали? Не вопрос. 1000р.

Если хочешь помощь, потому что у самого что-то не получается - давай конкретику, что непонятно, что делал, и вообще.

Zhbert ★★★★★
()

ТС, ты тег c++ поставил только потому, что комментарии в коде начинаются с

//
?

asaw ★★★★★
()
Ответ на: комментарий от shrub

Безусловно это так. Что есть массив в С? Это адрес его нулевого элемента + количество элементов в нем, которое нужно хранить отдельно + тип элементов.

t1nman
()
Ответ на: комментарий от beastie

Это не похоже на CRC, скорее какая-то самопальная контрольная сумма.

anonymous
()
Ответ на: комментарий от bestbat

Здесь проверяется, выставлен ли в CrcCode 8-й бит. 1 << 7 дает 10000000, & - побитовое И

t1nman
()

а альтернатива - утки можно эту хрень завернуть в расширение на cython

anon1984
()

Вот наваял...
Посмотрите, пожалуйста, соответствует ли код на Python коду С.
Что бы было удобнее сначала код на С, затем на Python.

// функция рассчитывает контрольную сумму
// последовательности байтов и возвращает результат.
// *InputData - указатель на последовательность байтов.
// BytesNumber - количество байтов,
// для которых считается контрольная сумма.
// Offset - смещение относительно начала последовательности
// байтов, с которого начинает считаться контрольная сумма
// (0 - без смещения).
// Возвращает контрольную сумму.
unsigned char
CrcMaker(unsigned char *InputData, unsigned char BytesNumber, unsigned char Offset)
{
        // Служебные параметры.
        register unsigned char i, j, Data, CrcCode = 0, Polinom = 0x69;

        for (i = Offset; i < BytesNumber + Offset; i++) {
                Data = InputData[i];
                for (j = 0; j < 8; j++) {
                        if  (CrcCode & (1 << 7)) {
                                CrcCode *= 2;
                                if (Data & (1 << 7))
                                        CrcCode ++;
                                CrcCode ^= Polinom;
                        } else { // if (CrcCode & (1 << 7))
                                CrcCode *= 2;
                                if (Data & (1 << 7))
                                        CrcCode ++;
                        } // if (CrcCode & (1 << 7))
                        Data *= 2;
                } // for (j = 0; j < 8; j++)
        } // for (i = Offset; i < BytesNumber + Offset; i++)

        // Вернѐм контрольную сумму.
        return CrcCode;
} // unsigned char ucCrcMaker ( ... )
//~~~~~~~~~~~~~~~~~~~~~~~~~~

Здесь код на Python:

# -*- coding: utf-8 -*-

BytesNumber = 4 # Количество байт для которых считается CRC
Offset = 0      # Смещение относительно начала последовательности
i = 0
j = 0
Data = 0        # Байт данных 
CrcCode = 0     # Контрольная сумма
Polinom = 0x69   


list = [0x01, 0xdc, 0x00, 0x09]  # Последовательность байт для которых считается CRC

while i < BytesNumber:
    Data = (list[i]);
    i = i + 1
    print str(Data)
    j = 0
    while j < 8:
        j = j + 1
    if CrcCode & (1 << 7):
        CrcCode *= 2
        if Data & (1 << 7):
            Data = Data + 1
        CrcCode = CrcCode ^ Polinom
    else:
            CrcCode *= 2
            if Data & (1 << 7):
                CrcCode = CrcCode + 1
            Data = Data + 1
print CrcCode            

Спасибо.

bestbat
() автор топика
Ответ на: комментарий от bestbat

циклы обычно так пишут

for (j = 0; j < 8; j++) # c
for j in xrange(8): # python

for (i = Offset; i < BytesNumber + Offset; i++) # c
for i in xrange(Offset, BytesNumber + Offset): # python

Bell
()
Ответ на: комментарий от bestbat
# -*- coding: utf-8 -*-

crc = 0     # Контрольная сумма
polinom = 0x69
input_data = [0x01, 0xdc, 0x00, 0x09]  # Последовательность байт для которых считается CRC

for data in input_data:
    print str(data)

    for _ in range(8):
        if crc & (1 << 7):
            crc *= 2
            if data & (1 << 7):
                crc += 1
            crc ^= polinom
        else:
            crc *= 2
            if data & (1 << 7):
                crc += 1

        data *= 2

print crc % 256  # returns "unsigned char"
anonymous
()

Спасибо anonymous, Bell, t1nman и всем остальным.
Все заработало!
Конечно я учусь... Всего месяц как с Python.
Наверное, когда то и я буду так же красиво писать программы :)

bestbat
() автор топика
Ответ на: комментарий от bestbat

цикл for _ in range(8) для каждого входного байта data и байт crc всегда выполняет одинаковые преобразования, которые можно свести к извлечению значения из таблицы на 256 элементов и исключающему или. Это должно натолкнуть на нужные мысли:

polinom = 0x69
def get(crc, data):
    for _ in range(8):
        f = crc & (1 << 7)
        crc *= 2
        if data & (1 << 7):
            crc += 1
        if f:
            crc ^= polinom
        data *= 2
    return crc % 256

def func(crc, d):
    return (crc, get(crc, d) ^ d)

for crc in range(256):
    print(func(crc, 1), func(crc, 7))

anonymous
()
Ответ на: комментарий от anonymous

Спасибо anonymous. Понемногу начинаю понимать...

bestbat
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.