Шифрование происходит следующим образом:
Создается хеш ключа с помощью SHA512(его размер = 16 байт).
Для каждого из 16 блоков хеша создается случайное число с помощью Random, используя значение блока в качестве начального числа.
Создается массив байтов того же размера, что и ввод, и заполняется случайными числами.
Каждый байт ввода XOR-суммируется с соответствующим байтом массива байтов.
что я сделал не так, подскажите пожалуйста
if (b[i] >= x || b[i] <= y) { a[j] = b[i]; j++; } ... if (b[i] < x || b[i] > y) { a[j] = b[i]; j++; }
if
не являются взаимоисключающими, а значит j
может стать больше чем n
и запись в a[j]
вылезет за границу массива.if (!(b[i] >= x || b[i] <= y))
и это гарантирует, что индекс не выйдет за пределы массива, вне зависимости от правильности первого условия. sizeof(dict)/sizeof(const char)
const char
а не на размер const char *
. Во избежание таких ошибок для вычисления размера массива обычно пишут sizeof(dict)/sizeof(dict[0])
. можно подумать, что при объявлении указателя, символ * относится к имени(не как часть, а как что-то зависящее от него), а не к типу.
const char *a, b;
можно превратить в const char (*a), b
, но нельзя превратить в const (char *a), b
или в char (const *a), b
.uint8_t led_state = 0x03; Данной командой мы завели переменную, которая равна 3
что под этим подразумевается?
HAL_GPIO_WritePin(GPIOE, led_state << 8, GPIO_PIN_SET); Это я так понимаю мы сначала устанавливаем самый первый светодиод, т.е. 8, но на практике ни так.
led_state = led_state >> 1 | led_state << 7;Эту строку совсем не понимаю.
Взял первый пример HTTP сервера на официальном сайте Boost
add_executable(main main.cpp)
http::server::server::server
. Почему программы с одних адресов начинаются?
Вот есть Tlb, представим это как линейный массив, или c , если все адреса будут одинаковы. То Очевидно что tlb будет работать в 1% своего множества
initialization of 'hInstanse' is skipped by 'case' label, почему?
switch (uMsg) { ... case WM_CREATE: //получаем дескриптор приложения HINSTANCE hInstance = GetModuleHandle(0); ... break; case WM_MOUSEMOVE: //устанавливаем тот или иной курсор в зависимости от местонахождения мыши ...
WM_MOUSEMOVE
код попадёт в область где hInstance определён, но минует его инициализацию. Компилятор туповат, чтобы понять, что hInstance дальше не используется. Простейший фикс -- обернуть код обработчиков в блоки:switch (uMsg)
{
...
case WM_CREATE:
{
//получаем дескриптор приложения
HINSTANCE hInstance = GetModuleHandle(0);
...
}
break;
case WM_MOUSEMOVE:
{
//устанавливаем тот или иной курсор в зависимости от местонахождения мыши
...
}
...
В svn было довольно удобно ориентироваться на последовательные номера редакций.
git describe
, в котором присутствует ближайшая метка (или выбранная метка, если делать git describe --match 'mask'
), количество коммитов после этой метки и хеш последнего коммита. Например, в одном и том же дереве linux я вижу:$ git describe
xtensa-6.8-rc2-esp32-spi-8-gb25ff15921c2
$ git describe --match 'v*'
v6.8-rc2-52-gb25ff15921c2
$ git describe --match 'v?.?'
v6.7-13495-gb25ff15921c2
считать количество русских букв, однако он не правильно это делает, что не так?
setlocale(LC_ALL, "");
const char *str = input.c_str();
while (*str) {
wchar_t c;
int n = mbtowc(&c, str, MB_CUR_MAX);
if (n < 0)
break;
if (wcschr(L"абвгд...юя", c))
++count;
str += n;
}
Компилирую gcc -o outfile source.c -lpthread. То есть собираю без всяких статиков, чтобы были зависимости к подключенным библиотекам. Далее запускаю процесс, чекаю /proc/pid/maps. Там нет ни единого упоминания к libpthread.
-lpthread
продолжали собираться, внутри пустая. Короче, ты выбрал неудачного кандидата для экспериментов. Почему в Си после main() не ставят ;?
;
между объявлением и телом функции, не только для main
, но и для любой другой функции. Согласно стандарту языка, например С99 приводит следующий синтаксис определения функции:function-definition:
declaration-specifiers declarator declaration-list<opt> compound-statement
declaration-list:
declaration
declaration-list declaration
extern int max(a, b)
int a, b;
{
return a > b ? a : b;
}
;
.эта строка работает на другом языке?
Почему
Serial.println
печатает то, что ты передаёшь ей на вход, а ты передаёшь ей на вход values[0][0]
-- это один символ, '8'.как это решить?
0xe918
-- 16-битное число. Если это симовл unicode в кодировке utf-8, то его байты должны идти как отдельные символы. Если ты собираешься печатать отдельные байты закодированных utf-8 символов, то не нужно делать этого функцией println
, потому что она вставит символ конца строки после печати каждого символа.unsigned int values[][6] = {
{0xE918, 0x14, 0xE918, 0x49, 0xE918, 0x48}
};
…
Serial.println(values[0][0], HEX);
Соответственно, мне нужно конвертировать массив wchar_t в массив char перед шифрованием, а после дешифровки выполнять обратную конвертацию.
Я поменял сигнатуру функции main() на int main(int argc, wchar_t* argv[]) (пытался исправлять на wmain, но тогда ругается ld и сборка падает с ошибкой).
int main(void)
, int main(int argc, char *argv[])
или эквивалентным. Там же написано, что набор символов во время выполнения программы -- implementation defined, поэтому нет гарантии, что их можно обработать кросплатформенно.Для конвертации wchar_t* в char* я пробовал использовать функцию wcstombs, однако почему-то у меня она совершенно не работает (при попытке преобразовать строку, содержащую только латиницу, я получаю null).
wcstombs
не занимается выделением памяти, если ты "получаешь null" -- это происходит в каком-то другом месте. Ну и если ты это делаешь внутри main принимающего wchar_t* argv[]
, то твой код интерпретирует строку char
как строку wchar_t
, что добавляет хаоса. Но в режиме отладки всё, как я уже писал выше, работает.
$ gcc -std=c99 -O2 -g3 -fsanitize=address main.c acp.c md5.c -o main
$ ./main
Base64('Hello') = "SGVsbG8="
MD5('Hello') = "8b1a9953c4611296a827abf8c47804d7"
=================================================================
==1045705==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x604000000071 at pc 0x7fb0d46486f8 bp 0x7ffd0affb580 sp 0x7ffd0affad30
WRITE of size 33 at 0x604000000071 thread T0
#0 0x7fb0d46486f7 in __interceptor_strcat ../../../../src/libsanitizer/asan/asan_interceptors.cpp:377
#1 0x564b2388c0de in prepareKeys /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:263
#2 0x564b2388cac4 in acraw /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:319
#3 0x564b2388d8c2 in acraws /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:401
#4 0x564b2388d8c2 in acraws_basic /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/acp.c:409
#5 0x564b2388a62e in testSimpleEncryption /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:20
#6 0x564b2388a368 in main /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main.c:111
#7 0x7fb0d44461c9 in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58
#8 0x7fb0d4446284 in __libc_start_main_impl ../csu/libc-start.c:360
#9 0x564b2388a440 in _start (/home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/main+0x3440)
0x604000000071 is located 0 bytes to the right of 33-byte region [0x604000000050,0x604000000071)
allocated by thread T0 here:
#0 0x7fb0d46b89cf in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
#1 0x564b2388fee7 in md5StringHash /home/jcmvbkbc/tmp/toster/1331202/alphacrypt2/md5.c:227
что не так
mov ecx, 5 ; Загружает количество гласных
…
inc ecx ; Увеличивает счетчик гласных
…
loop checkVowels ; Переходит к проверке следующей гласной
…
test ecx, ecx ; Проверяет, содержится ли гласная буква в слове