Форум: Форум C++Разное
Новые темы: 00
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: .hex контрольная сумма С++
 
 автор: ARES23Rus   (23.03.2012 в 18:07)   письмо автору
 
 

помогите я написал программу которая изменяет данные в хекс, мне нужно рассчитать контрольную сумму строки. писал на С++.
пример записи hex

:10010000214601360121470136007EFE09 D2190140
:100110002146017EB7C20001FF5F160021 48011988
:10012000194E79234623965778239EDA3F 01B2CAA7
:100130003F0156702B5E712B722B732146 013421C7
:00000001FF

Файл формата Intel HEX может состоять из любого количества записей. Каждая запись представляет собой ASCII-строку состоящую из нескольких пар 16-ричных цифр. Строка должна начинаться с символа двоеточия и оканчиваться парой символов CR и LF. Запись состоит из пяти полей следующего формата:
:LLAAAATTDD...CC
Каждая группа букв (LL, AAAA, TT и т. д.) представляет собой отдельное поле. Каждая буква — отдельную 16-ричную цифру (4 бита). Каждое поле состоит, как минимум, из двух 16-ричных цифр (байт). Ниже представлена расшифровка полей записи:
: Каждая запись в файле Intel HEX должна начинаться с двоеточия.
LL Поле длины — показывает количество байт данных (DD) в записи.
AAAA Поле адреса — представляет начальный адрес записи.
TT Поле типа. Оно может принимать следующие значения:
00 запись содержит данные двоичного файла.
01 запись является концом файла.
02 запись адреса сегмента (подробнее см. ниже).
03 Start Segment Address Record.
04 запись расширенного адреса (подробнее см. ниже).
05 Start Linear Address Record.
DD Поле данных. Запись может содержать несколько байт данных. Количество байт данных должно соответствовать полю LL.
CC Поле контрольной суммы. Поле контрольной суммы вычисляется путем сложения значений всех байт (пар 16-ричных цифр) записи по модулю 256 с последующим переводом в дополнительный формат (отнять получившееся значение от 0). Таким образом, если просуммировать все пары шестнадцатеричных чисел, включая LL, AA, TT, DD, CC, получится 0.


P.S. всё обычно делаю сам но инфу найти не могу =(

  Ответить  
 
 автор: cheops   (24.03.2012 в 15:08)   письмо автору
 
   для: ARES23Rus   (23.03.2012 в 18:07)
 

Давайте разбираться, возьмем для примера первую строку
LL AAAA TT DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD CC
10 0100 00 214601360121470136007EFE09D21901 40
LL везде равно 10, или переводя из шестнадцатиразрядной системы исчисления в десятичную 16 байт или 32 позициям в записи (4 бита на позицию), в самом деле если посчитать предпоследний фрагмент получается 32 значения.
Адрес AAAA принимает значения (так же переводим в десятичную систему)
0100 равно 256
0110 равно 272
0120 равно 288
0130 равно 304
В самом деле адреса идут с интервалом 16 байт, ну вроде что-то проясняется. 32 циферки затем (а это значение мы выяснили из LL) это данные, как раз остается две цифры CC – контрольная сумма. Суммируем все пары чисел (это шестнадцатеричные числа, если хотите можете перевести их в десятичный формат, только не забудьте потом перевести результат в шестнадцатеричный формат)
10 + 01 + 00 + 00 + 21 + 46 + 01 + 36 + 01 + 21 + 47 + 01 + 36 + 00 + 7E + FE + 09 + D2 + 19 + 01 = 3С0
По модулю, это означает, что все что вылазит за пределы 8 бит, две позиции – отбрасываем, остается C0 (в С++ будет вообще просто, нужно будет только подходящий тип данных выбрать). Складываем с контрольной суммой получаем C0 + 40 = 100, что по модулю опять дает 00. Что и требовалось доказать – контрольная сумма в порядке.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования