![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Всем привет!
Я новичок. Профессионально заниматься программированием не собираюсь, ибо поздновато это уже мне для зарабатывания денег (сыну 16 лет уже), а вот для самообразования и для решения мелких житейских задач программирование мне интересно. Ближе к делу. Начинаю разбираться с Дельфи. И для интереса решил реально нужную в жизни мне задачу поставить и с Вашей помощью её решить. Что надо: 1. Ввести число в ХЕКС счислении (к примеру B8 B5 1F 00 ). 2. Развернуть его задом на перёд (00 1F B5 B8). 3. Поменять местами полубайты в байтах (00 F1 5B 8B). 4. XOR FFFFFFFF (FF E0 4A 47). 5. Перевести в ДЕКС (4292889159) Или, что б долго не рассказывать, то сделать что-то похожее, как на рисунке. Calc.jpg Поможете мне сделать ЭТО? Спасибо! Последний раз редактировалось AVL, 04.01.2013 в 16:13. |
#2
|
||||
|
||||
![]() Цитата:
![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
|||
|
|||
![]() >1. Ввести число в ХЕКС счислении (к примеру B8 B5 1F 00 ).
Ну, тут достаточно контроля при вводе (разрешены для ввода только 0-9,A-F) и то, что кол-во введенных символов четно (length(edit1.text) div 2 = 0). >2. Развернуть его задом на перёд (00 1F B5 B8). Тоже легко. Хотя я бы сначала разбил бы строку на пары символов, потом бы разворачивал. >3. Поменять местами полубайты в байтах (00 F1 5B 8B). ну тут совсем просто, если учесть, что мы уже работаем со списком строк, в каждой из которых по 2 символа. >4. XOR FFFFFFFF (FF E0 4A 47). >5. Перевести в ДЕКС (4292889159) Вот тут лучше сразу перевести в DEC (HexToInt) и потом сделать XOR. Вообще, если нужно реализовать конкретный алгоритм (описанный по шагам), то это довольно просто. А вот если надо сделать нечто, что может выполнять набор операций, заранее не заданный, то тут немного сложнее. Задавай конкретные вопросы, бум помогать. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
AVL (03.01.2013)
|
#4
|
|||
|
|||
![]() Я думаю вам может помочь приложенный ниже калькулятор. Он может все. Но не может выполнять действия, описаны в п. 3,4,5. Я этим калькулятором давно пользуюсь, мне помогает, полностью подходит. Надеюсь вам тоже чем-то поможет.
|
Этот пользователь сказал Спасибо Dmitry_DM за это полезное сообщение: | ||
AVL (03.01.2013)
|
#5
|
|||
|
|||
![]() Всем спасибо.
Начну писать и задавать КОНКРЕТНЫЕ вопросы. В идеале - задача сложнее обстоит. А именно, взять файл с данными (внутри ХЕКС данные) и последовательно перебирать содержимое этого файла в поисках значения закодированного по определённому алгоритму. Алгоритм кодировки - известен. Он, к примеру, такой: Берём ДЕЦ значение, делим на 20, переводим в ХЕКС, разворачиваем данные задом наперёд. Так вот данные в ДЕЦ нам известны. Их надо найти в ХЕКС, в этом файле, в нескольких местах. Я это делаю обычним инженерным кальком за 7 секунд. Но, поскольку я решил изучить Дельфи в нужных для меня, неболших объёмах, то и решил выбратьреально нужную для меня задачу, а не абстрактный калькулятор какой-нибудь или автоматический выключатель компа с мобильного телефона... |
#6
|
||||
|
||||
![]() Используй TFileStream, в нем бегай на нужную позицию, данные можно вычитать fs.read(i {переменная назначения}, 4 {сколько байт вычитывать}) (чтение big-endian). если надо в десятичное значение, просто inttostr(i).
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
AVL (03.01.2013)
|
#7
|
||||
|
||||
![]() Набросал пример, но один пункт не понял - сам увидишь какой.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
AVL (04.01.2013)
|
#8
|
|||
|
|||
![]() Цитата:
![]() На фото слева как должно быть, а на фото справа то - что у нас получается. Последний раз редактировалось AVL, 04.01.2013 в 16:15. |
#9
|
||||
|
||||
![]() Сдвиг вправо на 5, это деление на 32. Для такого случая результат верный.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#10
|
|||
|
|||
![]() Цитата:
Когда я в своём нажимаю "ОК" то кальк СВОРАЧИВАЕТСЯ. В Вашем - по нажатии "ОК" кальк делает РАССЧЁТ. В моём кальке, как толко я ставлю галочку или ввожу число в окно ввода СРАЗУ меняются ВСЕ результаты, кнопку "ОК" жать не надо вообще, ибо, по указаной мною выше причине, её более уместным было б назвать "ВЫХОД". Как переделать алгоритм реакции на постановку "галочки" в окошке НАШЕГО калькулятора? Спасибо! |
#11
|
||||
|
||||
![]() Использовать OnClick каждого CheckBox-а. Я сначала так и хотел сделать, но меня как раз и смутила упомянутая кнопка.
![]() Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
AVL (05.01.2013)
|
#12
|
|||
|
|||
![]() Цитата:
Теперь смотрим дальше, что не так. ------------- 1. Имеем изначально 01 Е2 40. Но Вы его прописываете дальше как 00 01 Е2 40 (спереди два не значящих нуля появляются у Вас). И когда делаем ОБРАТНЫЙ ПОРЯДОК БАЙТ, то эти два нуля уже имеют значение и получаем громадное число. 40 Е2 01 00 вместо 40 Е2 01. Как исправить ЭТО. Я б сам хотел это сделать после вашей подсказки. ------------- 2. Инвертирование. У Вас вообще ничего не происходит. FF FF FF FF - 01 Е2 40 = FE 1D BF. При этой операции результат является (не знаю как это сказать по русски, я украинец), но Вы должны понять из моего примера. Последний раз редактировалось AVL, 05.01.2013 в 00:29. |
#13
|
||||
|
||||
![]() Цитата:
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#14
|
|||
|
|||
![]() Цитата:
Теперь изменение в чекбоксе сразу выдаёт результат. Но СДВИГ влево и вправо так просто переделать не удаётся, там надо две команды выполнить, на сколько я понял. Пробую разобраться. |
#15
|
|||
|
|||
![]() Цитата:
Ибо все дальнейшие рассчёты не имеют смысла при таком результате: 40E20100. |