Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.01.2013, 00:45
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
Вопрос Конвертор систем счисления с операциями над битами

Всем привет!
Я новичок. Профессионально заниматься программированием не собираюсь, ибо поздновато это уже мне для зарабатывания денег (сыну 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  
Старый 03.01.2013, 02:47
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от AVL
... (сыну 16 лет уже), ...
И что? Моему уже 30.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 03.01.2013, 04:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,097
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

>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  
Старый 03.01.2013, 13:15
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Я думаю вам может помочь приложенный ниже калькулятор. Он может все. Но не может выполнять действия, описаны в п. 3,4,5. Я этим калькулятором давно пользуюсь, мне помогает, полностью подходит. Надеюсь вам тоже чем-то поможет.
Вложения
Тип файла: rar calc.rar (195.6 Кбайт, 9 просмотров)
Ответить с цитированием
Этот пользователь сказал Спасибо Dmitry_DM за это полезное сообщение:
AVL (03.01.2013)
  #5  
Старый 03.01.2013, 13:30
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
По умолчанию

Всем спасибо.
Начну писать и задавать КОНКРЕТНЫЕ вопросы.
В идеале - задача сложнее обстоит.
А именно, взять файл с данными (внутри ХЕКС данные) и последовательно перебирать содержимое этого файла в поисках значения закодированного по определённому алгоритму.
Алгоритм кодировки - известен.
Он, к примеру, такой:
Берём ДЕЦ значение, делим на 20, переводим в ХЕКС, разворачиваем данные задом наперёд.
Так вот данные в ДЕЦ нам известны. Их надо найти в ХЕКС, в этом файле, в нескольких местах.
Я это делаю обычним инженерным кальком за 7 секунд. Но, поскольку я решил изучить Дельфи в нужных для меня, неболших объёмах, то и решил выбратьреально нужную для меня задачу, а не абстрактный калькулятор какой-нибудь или автоматический выключатель компа с мобильного телефона...
Ответить с цитированием
  #6  
Старый 03.01.2013, 14:14
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Используй TFileStream, в нем бегай на нужную позицию, данные можно вычитать fs.read(i {переменная назначения}, 4 {сколько байт вычитывать}) (чтение big-endian). если надо в десятичное значение, просто inttostr(i).
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
AVL (03.01.2013)
  #7  
Старый 04.01.2013, 02:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Набросал пример, но один пункт не понял - сам увидишь какой.
Вложения
Тип файла: rar cnv.rar (2.8 Кбайт, 9 просмотров)
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
AVL (04.01.2013)
  #8  
Старый 04.01.2013, 14:16
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Набросал пример, но один пункт не понял - сам увидишь какой.
Спасибо! Мне для старта самое оно, тем более, что кальк не работает как надо, соответственно есть стимул мне для понимания сути процесса
На фото слева как должно быть, а на фото справа то - что у нас получается.
Изображения
Тип файла: jpg 2Calc.JPG (50.8 Кбайт, 10 просмотров)

Последний раз редактировалось AVL, 04.01.2013 в 16:15.
Ответить с цитированием
  #9  
Старый 04.01.2013, 15:51
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Сдвиг вправо на 5, это деление на 32. Для такого случая результат верный.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #10  
Старый 04.01.2013, 16:07
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Сдвиг вправо на 5, это деление на 32. Для такого случая результат верный.
Да, Вы ПРАВЫ. Я не учёл сдвиг. Я попросту его не видел, а не видел потому, что принцип работы у этих двух кальков РАЗНЫЙ.
Когда я в своём нажимаю "ОК" то кальк СВОРАЧИВАЕТСЯ. В Вашем - по нажатии "ОК" кальк делает РАССЧЁТ.
В моём кальке, как толко я ставлю галочку или ввожу число в окно ввода СРАЗУ меняются ВСЕ результаты, кнопку "ОК" жать не надо вообще, ибо, по указаной мною выше причине, её более уместным было б назвать "ВЫХОД".
Как переделать алгоритм реакции на постановку "галочки" в окошке НАШЕГО калькулятора?
Спасибо!
Ответить с цитированием
  #11  
Старый 04.01.2013, 22:32
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Использовать OnClick каждого CheckBox-а. Я сначала так и хотел сделать, но меня как раз и смутила упомянутая кнопка.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Этот пользователь сказал Спасибо angvelem за это полезное сообщение:
AVL (05.01.2013)
  #12  
Старый 05.01.2013, 00:16
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Использовать OnClick каждого CheckBox-а. Я сначала так и хотел сделать, но меня как раз и смутила упомянутая кнопка.
Ясно. Спасибо. Думаю, что теперь сам с этим разберусь.
Теперь смотрим дальше, что не так.
-------------
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  
Старый 05.01.2013, 00:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от AVL
Имеем изначально 01 Е2 40.
Теперь посмотрим как это число хранится в памяти. Так - 0001E240, теперь перевернём - 40E20100. И это не моя задумка. В ассемблере имеется специальная команда производящая это действие.
Цитата:
(Byte SWAP)
Перестановка байтов

Назначение:
изменение порядка следования байтов;
переход от одной формы адресации к другой.
Под формой адресации здесь понимается принцип "младший байт по младшему адресу" или обратный ему. Существует ряд систем, например использующих микропроцессоры Motorola или большие ЭВМ, где применяется принцип размещения многобайтовых значений обратный тому, который используется в микропроцессорах Intel. Поэтому эту команду можно использовать для разработки программ-конверторов между подобными платформами и IBM РС.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #14  
Старый 05.01.2013, 00:52
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Использовать OnClick каждого CheckBox-а. Я сначала так и хотел сделать, но меня как раз и смутила упомянутая кнопка.
Поправил, как Вы сказали.
Теперь изменение в чекбоксе сразу выдаёт результат.
Но СДВИГ влево и вправо так просто переделать не удаётся, там надо две команды выполнить, на сколько я понял.
Пробую разобраться.
Ответить с цитированием
  #15  
Старый 05.01.2013, 00:55
AVL AVL вне форума
Прохожий
 
Регистрация: 03.01.2013
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Теперь посмотрим как это число хранится в памяти. Так - 0001E240, теперь перевернём - 40E20100. И это не моя задумка. В ассемблере имеется специальная команда производящая это действие.
Значит, надо в памяти хранить как 01E240, а не как 0001E240.
Ибо все дальнейшие рассчёты не имеют смысла при таком результате: 40E20100.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:22.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025