6-Byte Hexadezimalzählerscript etc...
6-Byte Hexadezimalzählerscript etc...
hallo,
eins vorneweg:
Ich beherrsche weder Script- noch andere Programmiersprachen, dass ich es selber programmiere, aber vllt. könnte jemand aus dem Forum, der das kann, mir dabei behilflich werden, so ein ein bis zwei Zeiler Script zusammenbasteln
Es soll von 00 00 00 00 00 00 bis FF FF FF FF FF FF zählen und diese in eine Textdatei schreiben.
Es ist egal, ob dieser 2-Zeiler in Shell,Perl oder Python geschrieben ist, wichtig ist, dass es funktioniert.
Wer kann mir helfen?
Danke.
eins vorneweg:
Ich beherrsche weder Script- noch andere Programmiersprachen, dass ich es selber programmiere, aber vllt. könnte jemand aus dem Forum, der das kann, mir dabei behilflich werden, so ein ein bis zwei Zeiler Script zusammenbasteln
Es soll von 00 00 00 00 00 00 bis FF FF FF FF FF FF zählen und diese in eine Textdatei schreiben.
Es ist egal, ob dieser 2-Zeiler in Shell,Perl oder Python geschrieben ist, wichtig ist, dass es funktioniert.
Wer kann mir helfen?
Danke.
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM
Re: 6-Byte Hexadezimalzählerscript etc...
Code: Alles auswählen
awk 'BEGIN{for(i=0;i<2^48;i++)printf("%012X\n",i)}'|sed 's,..,& ,g;s, $,,'
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
Noch fuenf Zeichen kuerzer:
Und mit extremem Missbrauch noch zwei weitere:
... wer macht eigentlich ausser mir noch mit?
Code: Alles auswählen
awk 'BEGIN{while(i<2^48)printf("%012X\n",i++)}'|sed 's,.., &,g;s,.,,'
Code: Alles auswählen
id|awk '{while(i<2^48)printf("%012X\n",i++)}'|sed 's,.., &,g;s,.,,'
... wer macht eigentlich ausser mir noch mit?
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
danke Meillo für die rasche Antwort.
Dank diesem Einzeiler kann ich alle Kombis in eine Textdatei umleiten,aber ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
Also so in etwa:
00 00 00 1f 3a 2c
4d 1a 2b 00 00 00
Oder auch solche:
00 00 00 00 00 1c
11 11 11 11 11 2d
Also mehrere Hexbyte, die mehr als 2 Hexbyte groß sind und aufeinander folgen, diese gleich weglassen aus der Textdatei, damit sie nicht unnötig groß wird.
Dank diesem Einzeiler kann ich alle Kombis in eine Textdatei umleiten,aber ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
Also so in etwa:
00 00 00 1f 3a 2c
4d 1a 2b 00 00 00
Oder auch solche:
00 00 00 00 00 1c
11 11 11 11 11 2d
Also mehrere Hexbyte, die mehr als 2 Hexbyte groß sind und aufeinander folgen, diese gleich weglassen aus der Textdatei, damit sie nicht unnötig groß wird.
/ASUS-F751S/ Intel Pentium N3710 @ 2.560Ghz
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM
VGA compatible controller: Intel Corporation Atom/Celeron/Pentium Processor x5-E8000/J3xxx/N3xxx Integrated Graphics Controller (rev 35)
Linux/5.19.13-arch1-1 x86_64 GNU/Linux
WindowManager: BSPWM
Re: 6-Byte Hexadezimalzählerscript etc...
Ich fuerchte nur, mein Code funktioniert nicht korrekt, da bei 00007FFFFFFF Ende ist. Das ist der maximale positive 32bit unsigned int. Muss dann wohl doch ein staerkeres Programm her bei dem die Groesse eines Int nicht begrenzt ist. Ein bc(1)-Script vielleicht?jimmy lukuluku hat geschrieben:danke Meillo für die rasche Antwort.
In Unix macht man das mit Einzelprogrammen in Pipelines. Zum Beispiel indem du sowas hinten anhaengst:Dank diesem Einzeiler kann ich alle Kombis in eine Textdatei umleiten,aber ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
Code: Alles auswählen
grep -v '\(.\)\1 \1\1 \1\1'
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
Wer sollte das sein wenn du schon im Thread aktiv bist?Meillo hat geschrieben:... wer macht eigentlich ausser mir noch mit?
Kann ich den Einzeiler bitte noch in Brainfuck haben?
Re: 6-Byte Hexadezimalzählerscript etc...
Bin's nun selbst angegangen. Es hat mich halt doch nicht losgelassen.Meillo hat geschrieben: Ich fuerchte nur, mein Code funktioniert nicht korrekt, da bei 00007FFFFFFF Ende ist. Das ist der maximale positive 32bit unsigned int. Muss dann wohl doch ein staerkeres Programm her bei dem die Groesse eines Int nicht begrenzt ist. Ein bc(1)-Script vielleicht?
Hier meine kuerzeste Komplettloesung die korrekt zu funktionieren scheint:
Code: Alles auswählen
echo 'obase=16;while(i<2^48)i++'|bc|awk '{printf("%0*d",12-length,0)}1'|sed 's,.., &,g;s,.,,;/\(.\)\1 \1\1 \1\1/d'
Das bedeutet, dass du nicht vor 2^24 anfangen musst, da zuvor die ersten drei Bytes sowieso immer Null sind.ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
Hier deshalb eine performantere Loesung die `i' geeignet vorinitialisiert:
Code: Alles auswählen
echo 'obase=16;i=2^24;while(i<2^48)i++'|bc|awk '{printf("%0*d",12-length,0)}1'|sed 's,.., &,g;s,.,,;/\(.\)\1 \1\1 \1\1/d'
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
Ich erwarte ja gar nicht, dass ihr mich unterbietet (hehe), aber ohne Gegenkandidaten kann ich schliesslich niemanden ausstechen.hikaru hat geschrieben:Wer sollte das sein wenn du schon im Thread aktiv bist?Meillo hat geschrieben:... wer macht eigentlich ausser mir noch mit?
Abgesehen von meiner grossen Ueberheblichkeit bringen natuerlich auch mir andere Ansaetze neue Ideen und fordern mich heraus es mit noch weniger moeglich zu machen.
Ich programmiere keine so kryptischen Sprachen.Kann ich den Einzeiler bitte noch in Brainfuck haben?
Use ed once in a while!
- schorsch_76
- Beiträge: 2630
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: 6-Byte Hexadezimalzählerscript etc...
Hier noch ein kleines C++ Programm das int64 (unsigned long long) nutzt, also auch bis 2^48 funktioniert Geht auch unter einem 32 Bit Betriebssystem
Übersetzen womöglich mit
Bin grad unter Windows, also gcc Compiler atm nicht verfügbar
Gruß
schorsch
Code: Alles auswählen
#include <iostream>
#include <iomanip>
int main(int argc, char** argv)
{
using namespace std;
unsigned long long limit = unsigned long long(1) << 48;
cout << setw(12)
<< setfill('0');
for (unsigned long long i = 0; i < limit; ++i)
cout << hex << i << endl;
return 0;
}
Code: Alles auswählen
gcc main.cpp -lstd-c++ -o hextest
Gruß
schorsch
Re: 6-Byte Hexadezimalzählerscript etc...
Cool, ein weiterer Beitrag.schorsch_76 hat geschrieben:Hier noch ein kleines C++ Programm
Das musste ich natuerlich gleich mal in C uebersetzen:
Code: Alles auswählen
#include <stdio.h>
int
main(void)
{
unsigned long long i=1LL<<24;
while (i<1LL<<48) {
printf("%012llX\n",i++);
}
return 0;
}
Dann musste ich natuerlich das Messer ansetzen und kraeftig kuerzen. Ich wollte wissen wieviel von dem es braucht damit es noch kompiliert und laeuft. Mein Ergebnis:
Code: Alles auswählen
long long i;main(){while(i<1LL<<48)printf("%012llX\n",i++);}
Anmerkungen:
- Headerfiles braucht man nicht unbedingt. Bei Funktionen der Standardbibliothek geht's (mit dem gcc) auch so.
- Externe Variablen werden automatisch mit 0 initialisiert.
- Alles was den Rueckgabewert von main() betrifft kann man notfalls auch weglassen.
- Unsigned braucht's nicht.
Bei mir laeuft es, jedenfalls. Mehr will ich nicht erwarten.
Seht ihr, kaum machen Andere mit biete ich euch wieder was.
EDIT: Das unsigned kann man auch noch weglassen, da 63 Bits immer noch genug sind.
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
Ich schick mal python ins Rennen:
Code: Alles auswählen
python3 -c "for i in range(2**48): print('%012X'%i)"
Re: 6-Byte Hexadezimalzählerscript etc...
Cool.dimi hat geschrieben:Ich schick mal python ins Rennen:
Code: Alles auswählen
python3 -c "for i in range(2**48): print('%012X'%i)"
Mir scheint das geht erst ab Python3, denn bei mir (Python 2.6.6) kommt:
Code: Alles auswählen
OverflowError: range() result has too many items
Gibt's eigentlich fuer Python auch so einen Direktzugriff auf die Dokumentation wie `http://php.net/funktionsname'? Ich wollte mich ueber range() schlau machen, habe aber nicht so recht zur richtigen Stelle gefunden. Dann hatte ich keine Lust mehr weiter zu suchen.
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
python -c "help(range)"Gibt's eigentlich fuer Python auch so einen Direktzugriff auf die Dokumentation wie `http://php.net/funktionsname'? Ich wollte mich ueber range() schlau machen, habe aber nicht so recht zur richtigen Stelle gefunden. Dann hatte ich keine Lust mehr weiter zu suchen.
Unix is user-friendly; it's just picky about who its friends are.
Re: 6-Byte Hexadezimalzählerscript etc...
Nur wenn diese am Anfangs oder Ende sind oder grundsaetzlich? Was ist also mit:jimmy lukuluku hat geschrieben:ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
[...]
Also mehrere Hexbyte, die mehr als 2 Hexbyte groß sind und aufeinander folgen, diese gleich weglassen[...]
12 88 88 88 88 21
?
Bisher bin ich davon ausgegangen, dass die ebenfalls gefiltert werden sollen. Wenn nicht, dann muessen wir Anker setzen.
Use ed once in a while!
Re: 6-Byte Hexadezimalzählerscript etc...
Ich habe nochmal darueber nachgedacht und einen Denkfehler meinerseits gefunden.
Korrekt ist:
... und das ist gleichzeitig kuerzer.
Das ist falsch:jimmy lukuluku hat geschrieben: Dank diesem Einzeiler kann ich alle Kombis in eine Textdatei umleiten,aber ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
Code: Alles auswählen
grep -v '\(.\)\1 \1\1 \1\1'
Code: Alles auswählen
grep -v '\(..\) \1 \1'
Use ed once in a while!