Hallo. Ich habe 16Byte Hex die ich in der Bash als Variable hochlaufen lassen möche. Wie mache ich das am Besten? zB 0102030405060708090A0B0C0D0E0F18 0102030405060708090A0B0C0D0E0F19 0102030405060708090A0B0C0D0E0F1A 0102030405060708090A0B0C0D0E0F1B Martin
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) |
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
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.
Hallo.
>i=$(echo "obase=16;ibase=16;$i+1" | bc)
schneidet die führende 0 ab.
Macht es Sinn statt hex in dec zu zählen?
Ansonsten reicht es auch wenn die ersten 8byte konstant bleiben.
Martin
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
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.