bash hex hochzählen

#6914983
Lesenswert?
• ▲
▼
Martin schrieb:
> Ich habe 16Byte Hex die ich in der Bash als Variable hochlaufen lassen
> möche.

Wo braucht man denn 16 Bytes große Integer?

foobar schrieb:
> i=120; while ((++i<140)); do printf "%02X\n" $i; done

Das wird aber mit 16 Byte großen Zahlen eher nicht mehr funktionieren. 
Mit den obigen Zahlen funktioniert es zumindest nicht:
1
i=1339673755198158349044581307228491544;
2
while ((++i<1339673755198158349044581307228491548)); do
3
printf "%02X\n" $i;
4
done
Da kommen nur die unteren 8 Byte an.

Unter Verwendung von bc sollte es machbar sein:
1
i=0102030405060708090A0B0C0D0E0F18
2
i=$(echo "obase=16;ibase=16;$i+1" | bc)
#6915010
Lesenswert?
• ▲
▼
Rolf M. schrieb:
> Da kommen nur die unteren 8 Byte an.

Die oberen 8 können ja erst einmal als konstant angenommen werden.

Ein 16-Byte unsigned Integer hat einen Wertebereich von 0 bis 7.77e55.

Das zählt keine bash mal eben so durch. Daher nochmals die Frage: von wo 
bis wo soll gezählt werden?

Das ergibt dann, wieviele der oben Bytes konstant bleiben, und einfach 
als konstanter Text ausgegeben werden können.

Oliver
Gast #6915048
Lesenswert?
• ▲
▼
Je nach kontext könnte eine Lösung dieser Art gangbar sein:

UPPERPART=0102030405060708090A0B0C0D0E
for LOWER4DIGITS in \
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}\
{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}
do
  fancy_command $UPPERPART$LOWER4DIGITS
done

Da bei dieser Herangehenweise erst alle möglichen Werte von der Shell 
expandiert werden und danach die einzelnen Werte abgearbeitet werden, 
ist das für eine hohe Anzahl ineffizient und stößt spätestens bei 
`getconf ARG_MAX` (Puffergröße, nicht Anzahl Paramter) an eine Grenze.
#6915298
Lesenswert?
• ▲
▼
Martin schrieb:
> Macht es Sinn statt hex in dec zu zählen?

Ganz ehrlich, du willst irgendwas, nicht wir. Den tieferen Sinn, in der 
bash zu zählen, kennst nur du.

Martin schrieb:
> Ansonsten reicht es auch wenn die ersten 8byte konstant bleiben.

Gute Erkenntnis. Die Tragweite von 7.77e55 scheint dir aber immer noch 
nicht ganz klar zu sein.
8 Byte haben nur noch läppische 2.8e19 Werte, da dauert die Aktion bei 1 
Milliarde Zählschritte pro Sekunde, was für eine bash vermutlich schon 
ganz ok ist, nur noch 578 Jahre.

Oliver

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.