Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

Intel HEX File и операции над HEX-данными.   Найти похожие ветки 

 
sdw_syscoder   (2004-07-25 22:39) [0]

Здравствуйте, мозговой фонд РФ!
Требуется выполнить операции над значениями  в HEX-формате (размер - 2 байта): X = $100 - ($3A9 and $FF).
По возможности лучше дайте ссылочку на примеры выполнения операций в шестнадцатиричном формате, т.е. сложение ($5C+$31+$3A), вычитание ($5C-$31-$3A) и т.д. Буду очень благодарен за помощь.
И ещё, у кого-нибудь есть описание формата файла Intel HEX File?


 
MU   (2004-07-25 22:52) [1]

???


 
Anatoly Podgoretsky ©   (2004-07-25 22:56) [2]

intel.com


 
GEN++ ©   (2004-07-25 23:00) [3]

А что Вы собтраетесь делать с этим Hex файлом, я вообще то
с этим форматом работаю.


 
Anatoly Podgoretsky ©   (2004-07-25 23:02) [4]

Ну он просто представления не имеет что это такое, иначе бы не рискнул такой вопрос задать.


 
GEN++ ©   (2004-07-25 23:13) [5]

Вообще то описание Intel Hex формат не сразу найдешь -
Я видел его в описании Ассемблнра для PIC процессоров фирмы
MicroChip (на русском). У меня с этим тоже поначалу были
заморочки: например MicroChip считает что в 1-й строке надо
указывать тип ресурса в который надо грузить данные, вот
HiTech считает что по умолчанию - это Flach (ПЗУ).
Если бы sdw_syscoder   описал задачу - может что нибудь готовое
подбросил.


 
sdw_syscoder   (2004-07-25 23:51) [6]

// Ну он просто представления не имеет что это такое, иначе бы не рискнул такой вопрос задать.

 А вот умничать не надо, почему не спросить, если не знаешь?

// А что Вы собтраетесь делать с этим Hex файлом, я вообще то
с этим форматом работаю.

Короче дело вот в чем. Этот формат применяется в записной книжке CASIO для передачи данных, если Вам известно, то структура файла такая (подробно расписывать не буду).

Вот текст, который требуется записать в CASIO:
T
123

А вот так его надо закодировать, чтобы книжка поняла:
:02000002A0005C - служебная строка
:02800000540D1D - заголовок записи, т.е. [Т]
:03800200313233E5 - содержимое записи, т.е. [123]
:00000001FF - конец файла

каждая из частей имеет свою структуру, ну и в общем надо преобразовать текст в HEX-формат, подсчитать CRC и отправить по назначению.
Прежде всего меня интересует преобразование из ASCII в HEX и сложение чисел в HEX-формате для подсчета CRC.

В принципе здесь всё просто, но время жалко...
//////


 
GEN++ ©   (2004-07-26 00:20) [7]

1. У меня к Вам просьба:
 Пожалуйста измените тон обращения к "Anatoly Podgoretsky ©   "

2.
Intel Hex file format:
<:><hi cntByte><lo cnt Byte><hi adrLoad><adrLoad><adrLoad><lo adrLoad><hi tipData>
  <lo tipData><hi data1><lo data1> .... <hi dataN><lo dataN><hi KS><lo KS>

<:> признак начала строки
<hi cntByte><lo cnt Byte> количество байт в строке (1 байт)
<lo cnt Byte><hi adrLoad><adrLoad><adrLoad><lo adrLoad> адрес загрузки (2 байта)
<tip Data> тип данных (строки) (1 байт)
    =00 конец файла
    =01 данные
    =04 установка/смена ресурса (может не использоваться)
    (У Вас я понимаю вводится допорлнительно 02)
<hi data1><lo data1> байт1 данных
<hi KS><lo KS> контрольная сумма; Подсчент:
      суммируем все символы строки кроме <:>, после каждой операции суммирования
      оставляем только мл байт результата иполучаем KS1
      KS:=$100-KS1

Работа с Hex текстом - очень просто:
var
X:word;
S:string;
begin
  S:="12AF";
  X:=strToInt("$"+S);
End;
пример кода (выдран из программы)

procedure TFConv.mmOpenClick(Sender: TObject);
var
Tip:Byte;//тип строки
KolB:word;//количество байт программы в строке
Adr:word;//начальный адрес загрузки программы
KS:byte;//контрольная сумма строки
ErrCod:byte;//код ошибки распаковки
n,k,i:word;
S:string;
flFlash:boolean;
AdrRes:word;
begin
     // Открытие файла *.hex
      if OpD1.Execute then
     begin
         FileName:=ChangeFileExt(OpD1.FileName,"");
         HexBuf.LoadFromFile(OpD1.FileName);
         SB1.SimpleText:= FileName;
         //распаковка файла в массив B_Bin
           if HexBuf.Count=0 then
           begin
               exit;
           end;
           //очистка входного буфера
           for n:=0 to $7FFF do B_Bin[n]:=$FF;
           for n:=0 to HexBuf.Count-1 do
           begin
               S:=HexBuf.Strings[n];
               if not(S[1]=":") then
               begin
                   ErrCod:=1;
                   break;
               end;
               Tip:=strtoint("$"+S[8]+S[9]);
                // Adr:=strtoint("$"+S[4]+S[5]+S[6]+S[7]);
           if Tip=4 then  adrRes:=strtoint("$"+S[12]+S[13]+S[10]+S[11]);
               if (Tip=4) and (AdrRes=0) then flFlash:=true;
                if (Tip=4) and (AdrRes>0)  then  flFlash:=false;

                 if (Tip=0) and (flFlash) then
                 begin   //распаковка строки
                     k:=length(S);
                     //подсчет контрольной суммы строки
                     KS:=0;
                     KolB:=strtoint("$"+S[2]+S[3]);
                     Adr:=strtoint("$"+S[4]+S[5]+S[6]+S[7]);

                       i:=10;
                     while i<k-1 do
                     begin
                         B_Bin[Adr]:=strtoint("$"+S[i]+S[i+1]);
                         inc(i,2);
                         inc(Adr);
                     end;
                 end;
           end;
          if mmBin.Checked then ConvHexToBin;
          if mmBas.Checked then ConvHexToBas;
     end;
   
end;


 
GEN++ ©   (2004-07-26 00:28) [8]

Да, вот еще забыл: обратное преобразование число в Hex текст

var
X:word;
S:string:
var
begin
  X:=strToInt("$12AF);
  S:=intToHex(X,4);
end;


 
GEN++ ©   (2004-07-26 00:47) [9]

>Вот текст, который требуется записать в CASIO:
>T
>123

>А вот так его надо закодировать, чтобы книжка поняла:
>:02 0000 02 A0 00 5C - служебная строка

>:02 8000 00 54 0D 1D - заголовок записи, т.е. [Т]
2 байта данных с адрес 0x8000
54 - hex код символа "T" для получения можно использовать: intToHex(ord("T"),2)
0D - обычно: Конец строки
>:03 8002 00 31 32 33 E5 - содержимое записи, т.е. [123]
3 байта данных с адреса 0x8002
31 hex код символа "1"
32 ....            "2"

>:00000001FF - конец файла
это будет всегда одинаково


 
sdw_syscoder   (2004-07-27 20:24) [10]

Добрый вечер!

Я здесь одного только не пойму, как происходит этот самый подсчет:

1) Что творится с массивом B_Bin[Adr] и какой у него тип, мне кажется можно и без него.
2) Зачем каждый отдельный результат соединения символов строки S[i], добавлять в массив
по новому индексу? Ведь потом, как я понял, содержимое всех индексов
надо будет суммировать.

               begin   //распаковка строки
                    k := length(S);
                    //подсчет контрольной суммы строки
                    KS := 0;
                    KolB := strtoint("$"+S[2]+S[3]);
                    Adr := strtoint("$"+S[4]+S[5]+S[6]+S[7]);

                      I := 10;
                    while I < k - 1 do
                    begin
                        B_Bin[Adr] := strtoint("$"+S[i]+S[i+1]);
                        inc(i,2);
                        inc(Adr);
                    end;
                end;

Если в чем-то не прав, поправьте и поясните.


 
Руслан   (2004-07-27 21:27) [11]

А не подскажите еще код преобразования hex в bin ?


 
Anatoly Podgoretsky ©   (2004-07-27 21:41) [12]

Руслан   (27.07.04 21:27) [11]
А bin для тебя, что это?


 
sdw_syscoder   (2004-07-27 23:03) [13]

// Anatoly Podgoretsky ©   (27.07.04 21:41) [12]

// Руслан   (27.07.04 21:27) [11]
// А bin для тебя, что это?

Если Bin для Руслана - это двоичное представление данных, то в Дельфях есть стандартная функция преобразования:

function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer;
const
 Convert: array["0".."f"] of SmallInt =
   ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
    -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,10,11,12,13,14,15);
var
 I: Integer;
begin
 I := BufSize;
 while I > 0 do
 begin
   if not (Text[0] in ["0".."f"]) or not (Text[1] in ["0".."f"]) then Break;
   Buffer[0] := Char((Convert[Text[0]] shl 4) + Convert[Text[1]]);
   Inc(Buffer);
   Inc(Text, 2);
   Dec(I);
 end;
 Result := BufSize - I;
end;

//

... или тебе нужен новоизобретённый велосипед?


 
sdw_syscoder   (2004-07-27 23:04) [14]

Народ, ответте кто-нибудь на вопрос [10]!!!



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.08 c
14-1090438685
k@rt
2004-07-21 23:38
2004.08.08
Winamp + 5 колонок


14-1090563364
X9
2004-07-23 10:16
2004.08.08
Компиляция Wine


1-1090500518
Gennady
2004-07-22 16:48
2004.08.08
Формат строки


14-1090400871
cherep
2004-07-21 13:07
2004.08.08
обратный -exe компилятор


14-1089942619
Думкин
2004-07-16 05:50
2004.08.08
С днем рождения! 16 июля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский