Стек вокруг переменной 'uChar' поврежден - PullRequest
2 голосов
/ 14 сентября 2011

Вот код, который преобразует шестнадцатеричную строку в байтовый массив, он работает нормально, но когда цикл заканчивается и компилятор достигает конца функции, он выдает эту ошибку: «Стек вокруг переменной uChar поврежден»

void Cfsp::stringToHex(unsigned char hexArray[], LPCTSTR string)
{
    int stringLength=strlen(string);
    int j=0;
    unsigned char  uChar = 0;
    for (int x = 0; x < stringLength; x+=2)
    {
        sscanf_s(&string[x], "%02x", &uChar);
        hexArray[j] = uChar;
        j++;
    }
}

Здесь я инициализирую массив и вызываю функцию.

unsigned char Key[16];
stringToHex( Key,"2f145a8b11d33217");

Я знаю, что когда stringToHex преобразует данную строку (длина 16 символов) в байтовый массив, он заполняет только 8 байтов (как символ). Я просто хотел сделать зарезервированную область в буфере.

Ответы [ 4 ]

5 голосов
/ 14 сентября 2011

Вот почему xxx_s функции не безопасны :-) Люди могут использовать эти безопасные функции так же легко, как и так называемые «небезопасные».

sscanf со спецификатором формата %x требует указатель int, а не char.

Он будет записывать все (например) 32-битное значение, начиная с uChar и не обращая внимания на один бит, что он перезаписывает в процессе.

Только потому, что у вас включена защита стека, код перехватывает это.

Вы должны использовать что-то вроде:

void Cfsp::stringToHex (unsigned char hexArray[], LPCTSTR string) {
    int stringLength = strlen (string);
    int j = 0;
    unsigned int uChar = 0;  // <-- INT rather than char.
    for (int x = 0; x < stringLength; x+=2) {
        sscanf_s (&string[x], "%02x", &uChar);
        hexArray[j] = uChar;
        j++;
    }
}
4 голосов
/ 14 сентября 2011

Причина, по которой вы получаете коррупцию, заключается в том, что вы отправляете sscanf_s unsigned char * туда, где она ожидает int *

3 голосов
/ 14 сентября 2011

Я не знаю, как работает sscanf_s, но из справочной страницы sscanf:

x Соответствует шестнадцатеричному целому числу без знака;следующий указатель должен быть указателем на unsigned int.

0 голосов
/ 14 сентября 2011

Ошибка, вероятно, вызвана "%02x", которая требует int как хранилище, а не беззнаковый char.

Возможно, проблема в том, что вы позвонили strlen(LPCTSTR). LPCTSTR может иметь или не иметь завершающий ноль, если он не strlen вызывает неопределенное поведение. Вместо этого используйте _tcslen(LPCTSTR).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...