< C > IntelHex, Checksum program segítség?
A feladat a köv.:
Irjon programot ami kiszámítja a kontrol összeget (checksum) megadott sorra ún. IntelHex fájl.
Definício: Kontrol összeg, ugy szamolja ki ,mint "kettes" /ket darab szam osszege/ osszeg egyes bajtoknak a sor elejetola a kontrol osszegig a.
Pelda:
Ha a kov. sor adott:
:10010000214601360121470136007EFE09D21901XX
Ki kell jonni az XX helyere a kontrol osszegnek 40 -re.
Demonstralja ezeken a pl sorokon:
:100010000C9445000C9445000C9445000C944500xx
:100020000C9445000C9445000C9445000C944500xx
:100030000C9445000C9445000C9445000C944500xx
:100040000C9445000C9445000C9445000C944500xx
Hogy oldanatok meg ?
Vegig kell menni a kettesevel a tombon es osszeadni ezeket, sscanf(tomb,"%2x",&sum); vegig megyek majd hexa formatba olvasom be ?! de ezutan mar nem tudom...mit kene
itt egy megoldasa:
#include <stdio.h>
void bin(int sum);
int main()
{
char s[]="100040000C9445000C9445000C9445000C944500";
int i,j,d,sum=1;
sscanf(s,"%2x",&d);
for(i=0;i!=(d*2+8);i+=2)
{
sscanf((s+i),"%2x",&j);
sum+=j;
sum=(((sum/256)+1)*256)-sum;
printf("Checksum Intel hex kodu\n:%sxx\nje rovny %x\n",s,sum);
getchar();
return 0;
}
>>>>>>>>>>>>>>>>>>>> sum=(((sum/256)+1)*256)-sum;
ezt a reszt nem ertem..hogy miert hogyan
most mar nekem is kijott a 40.
#include <stdio.h>
int main()
{
char tomb[]=":10010000214601360121470136007EFE09D2190140";
int sum = 0,length,i,val;
sscanf(tomb+1,"%2x",&length);
for(i = 0; i<length+4;i++)
{
sscanf(tomb+2*i+1,"%2x", &val);
sum += val;
printf("%x\n",sum);
}
printf("\n\n%x", sum);
sum &= 0xFF;
sum = 0x100 - sum;
sum &= 0xFF;
printf("\nChecksum Intel hex kodu\ %x\n",sum);
getchar();
return 0;
}
Kerdezhetnek meg par dolgot ..:
1.) sscanf(tomb+1,"%2x",&length); itt a 2x 2drb karakterenkent megy vegig a tombon es igy adja meg a length osszeget ? igy egy 10 karakteres tomb 5 lessz az erteke,ezt gondoltam ,de kirpobaltam ezt:
char tomb2[]="12345678";
sscanf(tomb2,"%2x",&length2);
es 18 at adott eredmenyul.
2.)
for(i = 0; i<length+4;i++)
a + 4 bajt ami ide kerul az osszegbe az micsoda? az lessz a checksum erteke?
3.)
sscanf(tomb+2*i+1,"%2x", &val);
ez tomb+2*i+1 a resz total sotet,talan azt tippelem h a +2 azert kell hogy a : ot kikeruljuk *i+1 nem tudom mire lehet..
5.)
sum &= 0xFF;
sum = 0x100 - sum;
sum &= 0xFF;
ez ugye a wikin levo algoritmus:
az összes mező 2-es komplemensben vett összegének/
ez ugye a sum
/ - kivéve az 1. és 6. - LSB-je. Számítása úgy történik, hogy összeadjuk a hexadecimálisan megadott bájtokat, majd az összegnek vesszük az LSB-jét (Least Significant Byte - Legkisebb értékű bájt), és ezt vagy kivonjuk 0x100-ból vagy invertáljuk (XOR 0xFF-fel) és hozzáadunk 1-et (ez lényegében az LSB 2-es komplemensének előállítása). Ezután a végeredményt AND-eljük 255-tel mivel 0x100-0 és (0x00 XOR 0xFF)+1 is egyenlő 0x100-zal,/
ez a rész nem tudom hol van
/ és ha nem 8 bites változókkal dolgozunk, akkor az overflow-t (túlcsordulást) el kell hagyni. Ha az ellenőrzőösszeg megfelelően van kiszámítva, akkor soronként minden egyes bájtot összeadva (a Bájtok számát, a Cím mindkét bájtját, a Rekord típust, minden Adat bájtot és az Ellenőrző összeget), akkor a végeredmény LSB-jének értéke 0x00 kell, hogy legyen.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!