AFON//Радиотехник
C++Builder · проект 29/50

Разбор Intel HEX

Проверка контрольной суммы записи.

Задача

Проверить строку прошивки формата Intel HEX по её контрольной сумме.

Компоненты на форме

Edit (EditHex), Button (ButtonCheck), Label (LabelOk).

Как работает

  1. Ввести строку, начинающуюся с ':'.
  2. Сложить все байты записи.
  3. Сумма по модулю 256 должна быть нулём.

Исходный код модуля

//---------------------------------------------------------------------------
// Проект 29. Разбор строки Intel HEX
// Проверка контрольной суммы записи прошивки.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------

// Строка Intel HEX: ':' LL AAAA TT [данные] CC. Контрольная сумма — до нуля
// по модулю 256 суммы всех байтов записи. Ядро проверяется на реальной строке.
int hexNibble(char c)
{
    if (c>='0'&&c<='9') return c-'0';
    if (c>='A'&&c<='F') return c-'A'+10;
    if (c>='a'&&c<='f') return c-'a'+10;
    return -1;
}
int hexByteAt(const AnsiString &s, int pos)   // pos 1-based
{
    int hi=hexNibble(s[pos]), lo=hexNibble(s[pos+1]);
    return (hi<0||lo<0)?-1:(hi<<4|lo);
}
bool intelHexOk(const AnsiString &line)
{
    if (line.IsEmpty() || line[1] != ':') return false;
    int len = (line.Length()-1)/2;
    int sum=0;
    for (int i=0;i<len;i++){
        int b=hexByteAt(line, 2+i*2);
        if (b<0) return false;
        sum += b;
    }
    return (sum & 0xFF) == 0;                    // включая байт контрольной суммы
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonCheckClick(TObject *Sender)
{
    AnsiString line = EditHex->Text.Trim();
    LabelOk->Caption = intelHexOk(line) ? "Контрольная сумма верна" : "Ошибка записи";
}
//---------------------------------------------------------------------------

Пояснения

  • Контрольный байт входит в сумму — итог обязан обнулиться.
  • Строка конца файла :00000001FF проходит проверку.
📦 help-user.ru — срочный ремонт компьютеров и восстановление данных в Москве: help-user.ru.

Что дальше

Создайте в C++Builder новый проект, разместите перечисленные компоненты и вставьте код модуля. Остальные 49 программ — в разделе проектов на C++Builder; смотрите также обзор среды и контроллеры AVR.