6-Byte Hexadezimalzählerscript etc...

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

6-Byte Hexadezimalzählerscript etc...

Beitrag von tHoRax » 15.12.2010 18:43:10

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 :D
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

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 15.12.2010 18:54:49

Code: Alles auswählen

awk 'BEGIN{for(i=0;i<2^48;i++)printf("%012X\n",i)}'|sed 's,..,& ,g;s, $,,'
Wer kriegt's kuerzer hin? ;-)
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 15.12.2010 19:33:25

Noch fuenf Zeichen kuerzer:

Code: Alles auswählen

awk 'BEGIN{while(i<2^48)printf("%012X\n",i++)}'|sed 's,.., &,g;s,.,,'
Und mit extremem Missbrauch noch zwei weitere:

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!

tHoRax
Beiträge: 560
Registriert: 22.12.2014 17:23:26

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von tHoRax » 15.12.2010 21:55:14

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.
/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

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 15.12.2010 22:27:59

jimmy lukuluku hat geschrieben:danke Meillo für die rasche Antwort.
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? ;-)
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.
In Unix macht man das mit Einzelprogrammen in Pipelines. Zum Beispiel indem du sowas hinten anhaengst:

Code: Alles auswählen

grep -v '\(.\)\1 \1\1 \1\1'
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13965
Registriert: 09.04.2008 12:48:59

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von hikaru » 15.12.2010 23:32:57

Meillo hat geschrieben:... wer macht eigentlich ausser mir noch mit? ;-)
Wer sollte das sein wenn du schon im Thread aktiv bist?
Kann ich den Einzeiler bitte noch in Brainfuck haben? ;-)

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 16.12.2010 14:15:09

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? ;-)
Bin's nun selbst angegangen. Es hat mich halt doch nicht losgelassen. ;-)

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'
ich würde gerne dabei gleich vorneweg Kombis mit mindestens 3 gleich aufeinanderfolgenden Hexbytes sowohl am Anfang als auch am Ende rausschmeissen.
Das bedeutet, dass du nicht vor 2^24 anfangen musst, da zuvor die ersten drei Bytes sowieso immer Null sind.

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!

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 16.12.2010 14:22:56

hikaru hat geschrieben:
Meillo hat geschrieben:... wer macht eigentlich ausser mir noch mit? ;-)
Wer sollte das sein wenn du schon im Thread aktiv bist?
Ich erwarte ja gar nicht, dass ihr mich unterbietet (hehe), aber ohne Gegenkandidaten kann ich schliesslich niemanden ausstechen. :wink:

Abgesehen von meiner grossen Ueberheblichkeit bringen natuerlich auch mir andere Ansaetze neue Ideen und fordern mich heraus es mit noch weniger moeglich zu machen.

Kann ich den Einzeiler bitte noch in Brainfuck haben? ;-)
Ich programmiere keine so kryptischen Sprachen. :-P
Use ed once in a while!

Benutzeravatar
schorsch_76
Beiträge: 2630
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von schorsch_76 » 16.12.2010 15:03:46

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 ;)

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;
}
Übersetzen womöglich mit

Code: Alles auswählen

gcc main.cpp -lstd-c++ -o hextest
Bin grad unter Windows, also gcc Compiler atm nicht verfügbar ;)

Gruß

schorsch

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 16.12.2010 15:38:28

schorsch_76 hat geschrieben:Hier noch ein kleines C++ Programm
Cool, ein weiterer Beitrag. :-)


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;
}
So sollte das korrekter C99 Code sein.

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++);}
Hier werden alle Regeln mit Fuessen getreten, das ist klar.

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!

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von dimi » 16.12.2010 17:55:09

Ich schick mal python ins Rennen:

Code: Alles auswählen

python3 -c "for i in range(2**48): print('%012X'%i)"

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 16.12.2010 18:09:54

dimi hat geschrieben:Ich schick mal python ins Rennen:

Code: Alles auswählen

python3 -c "for i in range(2**48): print('%012X'%i)"
Cool.

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!

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von catdog2 » 16.12.2010 18:13:55

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.
python -c "help(range)"
Unix is user-friendly; it's just picky about who its friends are.

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 16.12.2010 18:18:41

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[...]
Nur wenn diese am Anfangs oder Ende sind oder grundsaetzlich? Was ist also mit:
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!

Benutzeravatar
Meillo
Moderator
Beiträge: 9279
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: 6-Byte Hexadezimalzählerscript etc...

Beitrag von Meillo » 17.12.2010 21:39:02

Ich habe nochmal darueber nachgedacht und einen Denkfehler meinerseits gefunden.
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.
Das ist falsch:

Code: Alles auswählen

grep -v '\(.\)\1 \1\1 \1\1'
Korrekt ist:

Code: Alles auswählen

grep -v '\(..\) \1 \1'
... und das ist gleichzeitig kuerzer. ;-)
Use ed once in a while!

Antworten