Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(relok @  16.11.2010,  17:53 Найти цитируемый пост)
его нужно разделить на 3 числа, каждое от 0 до 255, 

тогда и объединяйте так :
Код

((x1 * 256) + x2 )*256+x3

или в битовых операциях то же самое
Код

((x1<<8 ) | x2)<<8) | x3

где 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,  18:55 Найти цитируемый пост)
понял. нужно если числа 2 2 2 к примеру, то объединять не в 222, а в 
00000010 00000010 00000010 

 smile 

Автор: relok 16.11.2010, 20:41
smile 
вы же мне то же самое только красивое кинули

а есть формула типа ((x1 * 256) + x2 )*256+x3
только наоборот?

от полученного таким образом числа перейти к x1 x2 x3?

Автор: mes 16.11.2010, 20:46
Цитата(relok @  16.11.2010,  19:41 Найти цитируемый пост)
от полученного таким образом числа перейти к x1 x2 x3?


Цитата(mes @  16.11.2010,  18:33 Найти цитируемый пост)
обратно получать с помощью операции деления и взятия остатка ( / , %)..

х2 = res /256 % 256;
для остальных сами.. 

Автор: relok 16.11.2010, 20:54
спасибо вам=)
а что можно почитать на эту тему? про числа, модули и тп
для меня это всё какие то чудесным образом работающие формулы

Автор: mes 16.11.2010, 21:09
Цитата(relok @  16.11.2010,  19:54 Найти цитируемый пост)
а что можно почитать на эту тему? про числа, модули и тп

про умножение, деление, и остаток - учебник по математики за 3й-4й класс  smile 

Автор: 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
Цитата(relok @  16.11.2010,  20:13 Найти цитируемый пост)
а вы сразу такую формулу красивую дали=)

 ну если это красивое.. то остальное в программирование просто шедевры smile
добро пожаловать в мир информатики 
 smile 



Автор: 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 с конца, а деление убирает одну цифру. Почитай более полное описание и пользуйся на здоровье.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)