У меня есть функция контрольной суммы в Python:
def checksum(data):
a = b = 0
l = len(data)
for i in range(l):
a += ord(data[i])
b += (l - i)*ord(data[i])
return (b << 16) | a, a, b
, которую я пытаюсь перенести на модуль C для скорости.Вот функция C:
static PyObject *
checksum(PyObject *self, PyObject *args)
{
int i, length;
unsigned long long a = 0, b = 0;
unsigned long long checksum = 0;
char *data;
if (!PyArg_ParseTuple(args, "s#", &data, &length)) {
return NULL;
}
for (i = 0; i < length; i++) {
a += (int)data[i];
b += (length - i) * (int)data[i];
}
checksum = (b << 16) | a;
return Py_BuildValue("(Kii)", checksum, (int)a, (int)b);
}
Я использую ее, открывая файл и передавая ему блок данных 4096.Они оба возвращают одинаковые значения для небольших строк, но когда я передаю двоичные данные прямо из файла, версия C возвращает совершенно разные значения.Любая помощь будет оценена.