Forum: PC-Programmierung bash hex hochzählen


von Martin (Gast)


Lesenswert?

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

von foobar (Gast)


Lesenswert?

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

von Oliver S. (oliverso)


Lesenswert?

Von wo bis wo?

Oliver

von Rolf M. (rmagnus)


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)

von Oliver S. (oliverso)


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

von Bashing (Gast)


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.

von Martin (Gast)


Lesenswert?

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

von Oliver S. (oliverso)


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

: 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
Noch kein Account? Hier anmelden.