Einerkomplement von Zeichenkette

mstank

Mitglied
Hallo an alle!

Ich möchte von eine Zeichenkette mit 20 Byte die Summe der 16-Bit Einerkomplemente bilden. Von dieser Summe soll anschließend wieder das Einerkomlement gebilder werden (wegen Prüfsumme).

Ohne genau zu verstehen habe ich ein vorhandenen Code verändert:
Code:
while (j<19)
{
  zeichen += ~(((unsigned int) IP_Frame[j])++);
  j++;
}

Nach meinen Berechnungen zufuß habe ich aber ein anderes Ergebnis raus.

Wer kann mir helfen?

THX Markus
 
Hi!


Das mit dem j<=19 bewirkt leider nichts. Dafür unterscheiden sich das Resultat vom Berechneten zu sehr.

Wie sieht es denn mit den Code in der Schleife aus? Was geschieht da genau?

Gruß MArkus
 
moin


Da du 20Bytes geschrieben hast bin ich davon ausgegangen das es sich bei dem Array um ein Array mit 20 Elementen handelt, also von 0 - 19, also muss es j <= 19 heissen.

Das ~ negiert jedes einzelne Bit des Variable um die es geht
Beispiel:
y = 11110000
y = ~y
dann y = 00001111

Es wird also immer das einer komplement von IP_Frame[ j ] zu zeichen hinzu addiert.
Bevor das einer komplement gebildet wird, wird der Wert in IP_Frame[ j ] aber noch um 1 erhöht.


mfg
umbrasaxum
 
Hi umbrasaxum!


Wenn ich dich richtig verstanden habe, handelt es sich hier um jeweils 8 Bit nämlich 1 Byte.

Es wird das 8-Bit Einerkomplement gebildet und die Zeichenkette wird um 1 Byte hochgezählt.

Wobei ich das 16-Bit Einerkomplement benötige. D.h.: Vom ersten und vom zweiten Byte soll zusammen das Einerkomplement gebildet werden. Diese 16 Byte werden dann zu Zeichen addiert und die Zeichenkette um zwei erhöht.

Wie kann ich das progen?

Danke Markus
 
Code:
 while (j<19)
  {
    zeichen += ~(((unsigned int) IP_Frame[j])++);
    j++;
  }
So machst Du aber das Zweierkomplement, wenn ich das noch richtig weiß. (y = (~x)+1)
Das Einerkomplement (y = ~x) wäre dann
Code:
 while (j<=19)
  {
    zeichen += ~((unsigned int) IP_Frame[j]);
    j++;
  }
Und Umbrasaxum hat recht: Du mußt 'j<=19' vergleichen
 
Wenn Du mit 16 Bit Zahlen arbeiten willst, mußt Du Dein Array aus 20 char's als Array aus 10 short int's behandeln.
 
Hallo an alle!


Ich habe versucht ein eigenes - zugegeben recht einfaches - Prog zu schreiben, um einen IP-Header zu basteln. Zur Berechnung der Prüfsumme habe ich folgenden Code:

void IP_Header_Pruefsumme (void)
{
unsigned summe = 0;
IP_Identification = 0x4203;
IP_Pruefsumme = 0x0000;

summe += ((unsigned int) ~IP_Vers_IHL_TOS << 8) | ~IP_Vers_IHL_TOS;
summe += ((unsigned int) ~IP_Laenge << 8) | ~IP_Laenge;
summe += ((unsigned int) ~IP_Identification << 8) | ~IP_Identification;
summe += ((unsigned int) ~IP_Flags_FO << 8) | ~IP_Flags_FO;
summe += ((unsigned int) ~IP_TTL_PROT << 8) | ~IP_TTL_PROT;
summe += ((unsigned int) ~IP_Pruefsumme << 8) | ~IP_Pruefsumme;
summe += ((unsigned int) ~IP_Source << 24) | ~IP_Source << 16;
summe += ((unsigned int) ~IP_Source << 8) | ~IP_Source;
summe += ((unsigned int) ~IP_Destination << 24) | ~IP_Destination << 16;
summe += ((unsigned int) ~IP_Destination << 8) | ~IP_Destination;


IP_Pruefsumme = ~summe;
}

Aber beim Versuch bestehende IP-Header nachzuahmen, erhalte ich immer andere Prüfsummen. Kann mir jemand helfen, wo der Fehler liegt? Oder gibt es hier jemand, der mir - basierend auf meinen Code - einen Lauffähigen Text geben kann?

Danke Markus
 
Zurück