String inkrementieren
-
Hallo Leute,
ich habe ein Problem. Und zwar habe ich eine Zahl in einem 8-byte String. Sagen wir 'B5 9A 81 62 D6 26 FE 6C'. Wie kann ich denn diese Zahl um eins erhöhen, dass dann wieder als 8-byte String 'B5 9A 81 62 D6 26 FE 6D' herauskommt? Das ganze wäre natürlich trivial, wenn es nicht diese Wechsel gäbe. 'B5 9A 81 62 D6 26 FC FF' wird zu 'B5 9A 81 62 D6 26 FD 00'. Hat jemand ne Idee, wie man das elegant und schnell hinbekommt? Schnell im Sinne von schnell gerechnet.
Danke schonmal,
Günther
-
Du kannst schauen, ob du den "String" (der ja kein C-String ist) bequem in ein unsigned long long bekommst, dabei muss natürlich die Byteorder (Endianess) beachtet werden. Dann kannst den unsigned long long einfach inkrementieren und wieder in den "String" zurückschreiben, auch hier natürlich die Byteorder beachten.
Solltest du kein long long haben, dann bleibt dir wohl nichts anderes übrig, als den Übertrag immer händisch mitzunehmen. Sollte aber auch kein Akt sein, würde ich sogar bevorzugen wenn du bei der ersten Variante erst noch alle Bytes drehen müsstest.
-
TactX schrieb:
Solltest du kein long long haben, dann bleibt dir wohl nichts anderes übrig, als den Übertrag immer händisch mitzunehmen. Sollte aber auch kein Akt sein, würde ich sogar bevorzugen wenn du bei der ersten Variante erst noch alle Bytes drehen müsstest.
meinst du in etwa so?
unsigned char number[8]={0xB5, 0x9A, 0x81, 0x62, 0xD6, 0x26, 0xFE, 0x6C}; if(number[7]+1 > 0xFF) { number[7]=0; if(number[6]+1 > 0xFF) { number[6]=0; if(number[5]+1 > 0xFF) { number[5]=0; if(number[4]+1 > 0xFF) { number[4]=0; if(number[3]+1 > 0xFF) { number[3]=0; if(number[2]+1 > 0xFF) { number[2]=0; if(number[1]+1 > 0xFF) { number[1]=0; if(number[0]+1 > 0xFF) { number[0]=0; }else { number[0]++; } }else { number[1]++; } }else { number[2]++; } }else { number[3]++; } }else { number[4]++; } }else { number[5]++; } }else { number[6]++; } }else { number[7]++; }
Das sieht zwar schön aus, ist aber doch eher russisch.
-
Das könntest du auch in eine Schleife packen:
for(i=7;i>=0;++i) if(number[i]==0xFF) number[i]==0; else { ++number[i]; break; }
Addition etc. könntest du ebenfalls in einer Schleife von hinten her aufzäumen, wobei du den aktuellen Übertrag jeweils mitnehmen mußt.
-
Ja, stimmt. An break; habe ich nicht gedacht.
Warum hast du denn ++i und ++number anstatt i++ und number++ benutzt?
-
Guenther schrieb:
Warum hast du denn ++i und ++number anstatt i++ und number++ benutzt?
Angewohnheit aus C++ - dort kann der Pre-Inkrement Operator schneller sein als der Post-Inkrement - und wenn der Rückgabewert egal ist, verwende ich fast grundsätzlich ersteren.
-
Hier mal zum Spass die Sache noch etwas allgemeiner
void inc_bytes(uint8_t *bytes, size_t num, uint8_t val){ uint16_t temp = val; int16_t i; uint8_t mask = (1U<<CHAR_BIT)-1; for(i=num-1; i>=0 && temp; i--){ temp += bytes[i]; bytes[i] = temp & mask; temp >>= CHAR_BIT; } }
-
Na wenn das keine FAQ wert ist.
-
CStoll schrieb:
Das könntest du auch in eine Schleife packen:
for(i=7;i>=0;++i) if(number[i]==0xFF) number[i]==0; else { ++number[i]; break; }
Müsste es aber nicht
int i; for(i=7;i>=0;i--) { if(number[i]==0xFF) { number[i]=0; } else { number[i]++; break; } }
heißen?
-
Guenther:
Mit dem Schleifenkopf (-- vs ++) dürftest Du Recht haben, der Rest ist allerdings identisch
-
LordJaxom schrieb:
Mit dem Schleifenkopf (-- vs ++) dürftest Du Recht haben, der Rest ist allerdings identisch
Was anderes habe ich auch nicht behauptet. Danke an alle.
Günther :xmas1:
-
Guenther schrieb:
Na wenn das keine FAQ wert ist.
Wie meinst denn das?
-
TactX schrieb:
Guenther schrieb:
Na wenn das keine FAQ wert ist.
Wie meinst denn das?
Was? Das?
Habe ich das geschrieben?
Nee, mal im Ernst. Ich dachte, so eine schöne Funktion um einen String zu erhöhen kann doch für alle diejenigen, die das gleiche Problem haben in die FAQs aufgenommen werden. Ich meine, wer hatte noch nicht das Problem, einen String zu erhöhen und wusste nicht wie?
Blöde Idee? Hm. Stimmt wohl.
Sanfte Grüße
vom Günther :xmas2:
-
Naja, soviele Leute habe ich noch nicht gesehen, die ein char-Array als Ultra-Long-Integer mißbraucht haben
Und die sind (meist) intelligent genug, sich da selber etwas zusammenzuspinnen.
Normalerweise versteht man unter einem String auch eine Zeichenkette - und die muß man bestenfalls vergleichen, durchsuchen und umbauen, aber nur in seltenen Fällen "erhöhen".
*grübelt* sollte ich vielleicht einen Artikel zum Thema "eigene Super-Int Klasse" in Angriff nehmen?
-
CStoll schrieb:
Und die sind (meist) intelligent genug, sich da selber etwas zusammenzuspinnen.
Toll, du hältst mich also für etwas blöd. Interessant.
Weniger Erfahrung + Wunsch nach einfachen Lösungen = blöd?
Günther
-
Guenther schrieb:
CStoll schrieb:
Und die sind (meist) intelligent genug, sich da selber etwas zusammenzuspinnen.
Toll, du hältst mich also für etwas blöd. Interessant.
Das nicht - nur zu ungeduldig, um selber länger nachzudenken
(dein Ansatz mit der geschachtelten if-Anweisung war schonmal nicht schlecht - und auf eine Schleife wärst du sicher auch noch gekommen (hoffe ich mal))
-
CStoll schrieb:
nur zu ungeduldig, um selber länger nachzudenken
(dein Ansatz mit der geschachtelten if-Anweisung war schonmal nicht schlecht - und auf eine Schleife wärst du sicher auch noch gekommen (hoffe ich mal))Ich habe schlicht nicht gewusst, dass man ne for-Schleife mit nem break unterbrechen kann. Die Versuche mit Rekursion und anderen Schleifen, die ich hatte, waren erfolglos oder zu kompliziert, als dass irgendjemand sie ohne größeren Aufwand hätte nachvollziehen können.
Danke trotzdem für deine Kritik.
Günther
-
Guenther schrieb:
Ich habe schlicht nicht gewusst, dass man ne for-Schleife mit nem break unterbrechen kann.
Das gehört schon fast in die Rubrik "fehlendes Grundlagenwissen" - mit einem break kommst du aus JEDER Schleife raus
-
CStoll schrieb:
Das gehört schon fast in die Rubrik "fehlendes Grundlagenwissen"
JETZT fühle ich mich schlecht.
-
Guenther schrieb:
CStoll schrieb:
Das gehört schon fast in die Rubrik "fehlendes Grundlagenwissen"
JETZT fühle ich mich schlecht.
Ärgere dich nicht, CStoll hat unrecht. Mit "break" kommt man nicht aus jeder Schleife raus.
-
@Guenther: Sorry, das war nicht beabsichtigt.
Andromeda schrieb:
Ärgere dich nicht, CStoll hat unrecht. Mit "break" kommt man nicht aus jeder Schleife raus.
Kannst du das auch belegen? Sprich: Zeig mir eine Schleife, die du nicht per break verlassen kannst.