LINUX.ORG.RU

История изменений

Исправление 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);
}