• Какой выбрать легкий и простой дистрибутив Linux для серфинга интернета?

    Погуглите "lightweight linux distros", их десятки. Некоторые занимают не более 250-300 Мб на накопителе (не шутка). Правда, там может быть вырезано очень много всего важного. Ну и да, сейчас один любой браузер больше 400 Мб весит...
    Написано
  • Как реализовать кроссплатформенную поддержку Unicode в аргументах командной строки в C?

    @popov654 Автор вопроса
    А, и да, в чём отличие преобразования (wchar_t*) в (char*) явным образом и вызова wcstombs? В том, что wcstombs проверяет корректность байтов (т.е. валидность кода) каждого символа? Или есть ещё особенности? Я просто без понятия, что она делает на самом деле.
    Написано
  • Как реализовать кроссплатформенную поддержку Unicode в аргументах командной строки в C?

    @popov654 Автор вопроса
    wcstombs не занимается выделением памяти,

    Эту ошибку я сам уже нашёл, но спасибо.

    Там же написано, что набор символов во время выполнения программы -- implementation defined, поэтому нет гарантии, что их можно обработать кросплатформенно.

    И как тогда правильно решить задачу?

    Т.е. исходные данные в любом формате можно зашифровать, а потом расшифровать обратно. Поэтому имеет смысл отделить преобразование форматов входных данных от шифрования/расшифровки.

    Я понимаю. Просто смотрите, мне хочется обеспечить расшифровку текста на другой ОС через консоль. Это хотя бы теоретически возможно? С байтовым режимом всё куда проще, там на выходе файл как последовательность байтов, и всё.

    то твой код интерпретирует строку char как строку wchar_t, что добавляет хаоса

    Могу ошибаться, но я читал в одном источнике, что на Windows новых версий наоборот аргументы в cmd.exe передаются в Unicode, и именно некий промежуточный C код (я только не понял, нужно ли его писать явно, или это происходит в фоне автоматически) конвертирует эти Unicode строки в строки ANSI. Вот пруф: https://github.com/wxWidgets/wxWidgets/issues/14580

    "...command line arguments are internally converted by CRT to ANSI and converted back to Unicode in wxWidgets. The simplest solution to avoid double conversion is to define macro wxIMPLEMENT_WXWIN_MAIN_CONSOLE conditionally"

    Ну и напоследок: я реализовал чтение аргументов через функции WinAPI, заключив их в #ifdef. Насколько это индусский код, и что с ним будет на Linux? У меня пока не дошли руки протестировать в виртуальной машине.

    Актуальная версия кода здесь
    Написано
  • Как реализовать кроссплатформенную поддержку Unicode в аргументах командной строки в C?

    @popov654 Автор вопроса
    Не все проекты принимают строки в кириллице. Я даже сходу сейчас не знаю, куда смотреть
    Написано
  • Как реализовать кроссплатформенную поддержку Unicode в аргументах командной строки в C?

    @popov654 Автор вопроса
    Нашёл функцию для обратной конвертации: https://learn.microsoft.com/en-us/cpp/c-runtime-li.... Осталось только разобраться, почему у меня null получается. Проект собираю на Windows 10 build 1909
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    jcmvbkbc, большое спасибо за помощь, сейчас проект нормально отрабатывает и в отладчике, и напрямую. Кроме того, я поправил Makefile, теперь можно собирать через make.

    C:\Users\Alex\Documents\cpp\alphacrypt>acp.exe -i """Hello world!""" -k mysecretpass
    s3Q3f5crD7zwY#25484#5
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Wataru, оказалось, что косяк был в неверном использовании strcpy().
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Оказалось, что дело было в strcpy() и моём неправильном понимании её работы. Вот что значит всю жизнь на PHP и JS кодить, потом такие вещи вообще кажутся не очевидными.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    jcmvbkbc, каким образом оно тогда не падало при отладке? Очень странная история. Вообще я правда был уверен, что эта функция выделает новую память для конкатенации... Удобно было бы
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    jcmvbkbc,
    я очень хотел бы узнать, как оно у тебя собирается

    gcc main.c acp.c md5.c -o main

    Например так. Да, ламерский подход, но в учебнике для начинающих по C++ рекомендуют именно так и компилировать решения, только через g++. Если бы в коде было что-то совсем плохое, код бы вообще не скомпилировался - а тут он компилируется. И в режиме отладки даже идеально отрабатывает.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    jcmvbkbc,
    Кроме того, ты используешь функцию itoa, но это нестандартная функция, в стандартную библиотеку C она не входит.

    Я в интернете нашёл это решение. Чем-то адекватным его можно заменить, или нужно писать свою реализацию?

    при этом нет ни одного файла *.cpp, я очень хотел бы узнать, как оно у тебя собирается

    Я говорил о том, что после прохода отладчиком в папке остаётся exe файл. Это не считается? Он ведь в любом случае генерируется компилятором. Make файл этот я в данный момент по сути не использую, надо сделать нормальный и начать использовать, просто руки пока не дошли. Мне бы с кодом разобраться
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    E:/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lasan: No such file or directory
    collect2.exe: error: ld returned 1 exit status

    Вот такое пишет
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    jcmvbkbc, видимо, то, что я вижу в режиме отладки - это работа некого интерпретатора, исполняющего мой код построчно, я прав? Но с памятью он реальной работает, верно? Если у меня при ошибках с адресами данные перетирались.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    jcmvbkbc, у меня собирается, но без этого флага. Я так понимаю, этот флаг обязателен, без него компилировать не принято? Почему в отладчике работает?

    & 'c:\Users\Alex\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-jcy0pkn1.aoz' '--stdout=Microsoft-MIEngine-Out-hsfqfz5g.clb' '--stderr=Microsoft-MIEngine-Error-mnxcifzi.5or' '--pid=Microsoft-MIEngine-Pid-mxlmcoo1.oxa' '--dbgExe=E:\msys64\ucrt64\bin\gdb.exe' '--interpreter=mi'

    Вот такой командой я запускаю отладку. Точнее, запускаю я её кнопкой, VS Code за меня её запускает.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    И как это понимать? Я вообще на строке 263 у себя не вижу ничего такого, что могло бы вызвать проблему. Там символы по индексам заполняются, перед этим выделяется память под строку в корректном размере. Сейчас ещё раз перечитал построчно код - выглядит корректно.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Wataru, я сейчас поменял строки с 225 по 228 на следующий код:
    key_cache[i].strong_value[round * 2] = (char*) calloc(128, 1);
    memcpy(key_cache[i].strong_value[round * 2], value[0], strlen(value[1]));
    key_cache[i].strong_value[round * 2 + 1] = (char*) malloc(strlen(value[1])+1);
    strcpy(key_cache[i].strong_value[round * 2 + 1], value[1]);

    Я подумал, проблема может быть в том, что у меня в key_cache[i].strong_value[round * 2] копируются лишние данные (по сути так оно и было). Поэтому я заменил malloc() на функцию, которая инициализирует память нулями, и поменял последний аргумент в memcpy() на фактический размер реальных данных. Но, опять же, это ничего не дало.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Wataru, "Вы там какую-то строку засовываете в key в итоге" - в keys[i] засовывается массив unsigned char, то есть именно байты, не символы. Распечатать это содержимое не получится, только в виде целых чисел в цикле. Там не требуется нуль-терминатор, поскольку максимальный размер массива фиксирован в 128 байтов (однако фактический - меньше, но после чтения хвост не будет использоваться, за это отвечает специальная переменная, уникальная для каждой итерации кодирования исходного текста). ck_str - это строковое представление того же самого ключа, на его основе делается ключ для следующей итерации.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Дмитрий, так и есть, но в конце '\0' символ же ещё. Это строка именно
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Wataru, md5StringHash возвращает строку длиной 32 символа - или 33 байта. В malloc() там передаётся именно 33.

    Заменил на заглушку (return "123456"), стало падать в других местах.
    Написано
  • Скомпилированный в GCC exe файл вылетает досрочно?

    @popov654 Автор вопроса
    Wataru, со строками я вроде поправил размер выделяемой памяти везде (если только не проглядел ничего).

    А вообще, там, где у меня были прямо крупные ошибки с размером в malloc() (выделялось в разы или на порядок меньше, чем надо), я это видел в режиме отладки прекрасно вчера-позавчера. Даже не в виде сегфолтов, а просто затирались одни данные другими, я это при просмотре массивов наблюдать мог.

    А тут какая-то странная ерунда - в debug режиме всё работает, в нормальном - падает без сообщений в системный журнал или ещё куда-то... Интересно, кстати, можно ли настроить, чтобы реально ОС регистрировала такое падение.
    Написано