| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > всё то же обьединение чисел, только наоборот |
| Автор: relok 16.11.2010, 17:46 |
| есть 3 числа (0...255) 98 113 104 (int) к примеру я их объединил в 98113104 (int одно такое большое) зашифровал в RSA, записал в файл, прочитал, декодировал, получил 98113104 теперь соответственно нужно их обратно в 98 113 и 104 превратить) всё просто - читаю первые три, если полученное число больше 255, то первые два и будут составлять 98 (первый символ)..смещаю указатель на 2 (или 3 числа) и так далее..113..104 есть ли такая комбинация из 3 чисел (0...255 каждое) , что произойдет ошибка при таком разбиении? или есть другой способ это сделать? |
| Автор: bsa 16.11.2010, 18:29 |
| relok, есть. и намного более простой. На сколько я знаю, RSA работает с блоками данных, размером равным ключу шифрования. Обычно, это что-то типа 1024 - 128 байт. Это значит, что шифровать нужно блок размером 128 байт. Выделяешь память на 128 char, в первые элементы пишешь кодируемые данные, для остального делаешь дополнение (в описании сказано как). шифруешь... расшифровываешь, берешь 3 первых байта. Если тебе нужно шифровать 24-х или 32-х битное слово, то тогда не морочься так, как ты это делал. А воспользуйся родными для компьютера типами и преобразованиями: uint32_t word = ((uint32_t)num3 << 16) | ((uint32_t)num2 << 8) | num1; |
| Автор: relok 16.11.2010, 18:53 |
| не понял о чем вы есть число 98113104 его нужно разделить на 3 числа, каждое от 0 до 255, т.е. на 98 , 113 и 104 блоки - по 3 байта, т.к. для лабы нету смысла брать большой модуль а про uint32_t word = ((uint32_t)num3 << 16) | ((uint32_t)num2 << 8) | num1; первый раз слышу=) |
| Автор: mes 16.11.2010, 19:33 | ||||
тогда и объединяйте так :
или в битовых операциях то же самое
где xn - 8битовая char, но раз не сталкивались замените привычными действиями т.е. 1 вариант. обратно получать с помощью операции деления и взятия остатка ( / , %).. Добавлено через 1 минуту и 36 секунд если 256 не устраивает возьмите 1000, главное чтоб разрядность сохранить и места в переменной_результата хватило.. |
| Автор: relok 16.11.2010, 19:55 |
| попробую разбираться в том, что вы написали так как то что я задумал, неосуществимо если соединить к примеру 13 , 13 и 13, то получится 131313 если соединить 131 , 31 и 3, то получится тоже самое 131313 то есть декодировать будет невозможно блин понял. нужно если числа 2 2 2 к примеру, то объединять не в 222, а в 00000010 00000010 00000010 = 131586 |
| Автор: mes 16.11.2010, 20:34 | ||
|
| Автор: relok 16.11.2010, 20:41 |
вы же мне то же самое только красивое кинули а есть формула типа ((x1 * 256) + x2 )*256+x3 только наоборот? от полученного таким образом числа перейти к x1 x2 x3? |
| Автор: mes 16.11.2010, 20:46 | ||
х2 = res /256 % 256; для остальных сами.. |
| Автор: relok 16.11.2010, 20:54 |
| спасибо вам=) а что можно почитать на эту тему? про числа, модули и тп для меня это всё какие то чудесным образом работающие формулы |
| Автор: mes 16.11.2010, 21:09 |
про умножение, деление, и остаток - учебник по математики за 3й-4й класс |
| Автор: relok 16.11.2010, 21:13 |
| =) у меня была задача - три числа нужно закодировать числом одним и декодировать, не потеряв о них информацию понял как решить - эти 3 байта объединить в одно инт число путём составления из них последовательности битов (если 2, 2 и 2, то 00000010 00000010 00000010 ) эту последовательности перевести в десятичное число и его кодировать я бы всё это делал тупо - нахожу 24 бита, высчитываю бездумно 0*1 + 1*2 + 0*4 + 0*8 и т.п. а вы сразу такую формулу красивую дали=) я тоже так хочу научиться |
| Автор: mes 16.11.2010, 21:27 |
ну если это красивое.. то остальное в программирование просто шедевры добро пожаловать в мир информатики |
| Автор: bsa 17.11.2010, 00:49 |
| relok, в байте хранится число от 0 до 255. Итого 256 значений. В слове (16 бит - 2 байта) хранится уже 65536 значений (256 * 256). Это тебе особо ничего не говорит... Именно для этого придумана была 16-тиричная система. 256 == 0x100, 65536 = 0x10000... Тебе это ничего не напоминает? Таким образом, чтобы запихать 3 байта в одно 32-х разрядное число достаточно: x = a0 + a1 * 0x100 + a2 * 0x10000. В компьютерной технике все так же, как и в жизни. Но у компьютера не 10 пальцев, поэтому считать он может только до 1. Для удобства людей были придуманы 8-ме и 16-теричные системы, которые объединяют в одной цифре 3 или 4 бита соответственно. Восьмеричная нужна редко, а вот 16-теричная часто. Математика такая же, как и в десятеричной - умножение на 0x10 добавляет к числу 0 с конца, а деление убирает одну цифру. Почитай более полное описание и пользуйся на здоровье. |