История изменений
Исправление HighMan, (текущая версия) :
Покажи код
PyObject * crypto(PyObject *self, PyObject *args){
int key_size, key_pos, buf_size;
char * key = NULL, * buf = NULL;
if(!PyArg_ParseTuple(args, "yiiyi", &key, &key_size, &key_pos, &buf, &buf_size))
return NULL;
if(key_pos > key_size)
key_pos = 0;
char * data = malloc(buf_size);
memset(data, 0, buf_size);
int b, k = 0;
for(b = 0, k = key_pos; b < buf_size; b += 1, k += 1){
if(k == key_size - 1)
k = 0;
if(buf[b] == key[k]){
// Тут и кроется проблема
// если buf[b] == key[k] то xor на них дает 0
// а python этот 0 считает концом массива \x0\
// если же этот код перевести в python то при получении
// 0 в массив записывается \x00T\
// По крайней мере так показывает отладчик в vscode
data[b] = '\0';
continue;
}
data[b] = buf[b] ^ key[k];
}
return Py_BuildValue("yi", data, k);
}
Исправление HighMan, :
Покажи код
PyObject * crypto(PyObject *self, PyObject *args){
int key_size, key_pos, buf_size;
char * key = NULL, * buf = NULL;
if(!PyArg_ParseTuple(args, "yiiyi", &key, &key_size, &key_pos, &buf, &buf_size))
return NULL;
if(key_pos > key_size)
key_pos = 0;
char * data = malloc(buf_size);
memset(data, 0, buf_size);
int b, k = 0;
for(b = 0, k = key_pos; b < buf_size; b += 1, k += 1){
if(k == key_size - 1)
k = 0;
if(buf[b] == key[k])
// Тут и кроется проблема
// если buf[b] == key[k] то xor на них дает 0
// а python этот 0 считает концом массива \x0\
// если же этот код перевести в python то при получении
// 0 в массив записывается \x00T\
// По крайней мере так показывает отладчик в vscode
data[b] = '\0';
data[b] = buf[b] ^ key[k];
}
return Py_BuildValue("yi", data, k);
}
Исправление HighMan, :
Покажи код
PyObject * crypto(PyObject *self, PyObject *args){
int key_size, key_pos, buf_size;
char * key = NULL, * buf = NULL;
if(!PyArg_ParseTuple(args, "yiiyi", &key, &key_size, &key_pos, &buf, &buf_size))
return NULL;
if(key_pos > key_size)
key_pos = 0;
char * data = malloc(buf_size);
memset(data, 0, buf_size);
int b, k = 0;
for(b = 0, k = key_pos; b < buf_size; b += 1, k += 1){
if(k == key_size - 1)
k = 0;
if(buf[b] == key[k])
// Тут и кроется проблема
// если buf[b] == key[k] то xor на них дает 0
// а python этот 0 считает концом массива \x0\
// если же этот код перевести в python то при получении
// 0 в массив записывается \x00T\
// По крайней мере так показывает отладчик в vscode
data[b] = '\0';
}
return Py_BuildValue("yi", data, k);
}
Исходная версия HighMan, :
Покажи код
PyObject * crypto(PyObject *self, PyObject *args){
int key_size, key_pos, buf_size;
char * key = NULL, * buf = NULL;
if(!PyArg_ParseTuple(args, "yiiyi", &key, &key_size, &key_pos, &buf, &buf_size))
return NULL;
if(key_pos > key_size)
key_pos = 0;
char * data = malloc(buf_size);
memset(data, 0, buf_size);
int b, k = 0;
for(b = 0, k = key_pos; b < buf_size; b += 1, k += 1){
if(k == key_size - 1)
k = 0;
if((data[b] = buf[b] ^ key[k]) == 0)
data[b] = '\0';
}
return Py_BuildValue("yi", data, k);
}