Bitweises umdrehen einer Datei: 010011->110010
- Frosch6669
- Beiträge: 163
- Registriert: 02.07.2003 23:16:49
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Hamburg
-
Kontaktdaten:
Bitweises umdrehen einer Datei: 010011->110010
Hallo
kennt jemand ein Programm was das kann?
"Bitweises umdrehen einer Datei: 010011->110010"
Oder weiß vielleicht jemand wie man es programmieren kann, besser noch scripten?
Vielen Dank im voraus...
Frosch
kennt jemand ein Programm was das kann?
"Bitweises umdrehen einer Datei: 010011->110010"
Oder weiß vielleicht jemand wie man es programmieren kann, besser noch scripten?
Vielen Dank im voraus...
Frosch
- Six
- Beiträge: 8071
- Registriert: 21.12.2001 13:39:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Siegburg
Re: Bitweises umdrehen einer Datei: 010011->110010
Willst du eine Binärdatei umdrehen oder nur eine Zeichenkette?
Be seeing you!
Re: Bitweises umdrehen einer Datei: 010011->110010
"Bitweises umdrehen", lässt für mich keine Interpretation zu.
Re: Bitweises umdrehen einer Datei: 010011->110010
Ich bin nicht ganz sicher, ob ich die Aufgabenstellung richtig verstanden habe, aber hab mal was in Python als weitere Diskussionsgrundlage zusammengeklimpert ... absichtlich konservativ formuliert, damit es möglichst fast 1:1 in C übersetzbar sei, falls die Geschwindigkeit unter Python zum Problem wird...
Das macht sowas:
Code: Alles auswählen
#!/usr/bin/python --
#
# bitrev.py ... erster Anlauf
# in einer Pipe benutzen a la:
# echo -ne '\x80\x40' | ./bitrev.py | od -tx1
import sys
s = sys.stdin.read()
l = len(s)
while l:
l -= 1
bit = 1
tim = 128
out = 0
while bit < 255:
if ord(s[l]) & bit:
out |= tim
bit <<= 1
tim >>= 1
sys.stdout.write(chr(out))
sys.stdout.flush()
Code: Alles auswählen
$ echo -ne '\x80\x40\x20\x10' | ./bitrev.py | od -tx1
0000000 08 04 02 01
0000004
-
- Beiträge: 3472
- Registriert: 30.11.2005 10:32:22
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Wald
Re: Bitweises umdrehen einer Datei: 010011->110010
Ich hab's mal so probiert:
Code: Alles auswählen
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
inline uint8_t get_bit(uint8_t i, uint8_t input)
{
return (input & (1<<i));
}
uint8_t swap_bit(uint8_t byte)
{
uint8_t ret = 0;
uint8_t i;
for (i=0;i<4;i++)
{
ret |= get_bit(i,byte) << (7-2*i);
}
for (i=0;i<4;i++)
{
ret |= get_bit(i+4,byte) >> (1+2*i);
}
return ret;
}
int main (int argc, char **argv)
{
FILE *input_file;
input_file = fopen(argv[1],"r");
uint8_t a,b;
long filesize,i;
fseek(input_file,0,SEEK_END);
filesize=ftell(input_file);
for (i=filesize;i>-1;i--)
{
fseek(input_file,i,SEEK_SET);
a = fgetc(input_file);
b = swap_bit(a);
printf("%x\n",b);
}
return 0;
}
- Six
- Beiträge: 8071
- Registriert: 21.12.2001 13:39:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Siegburg
Re: Bitweises umdrehen einer Datei: 010011->110010
Da kann ich dir auch nicht helfenDanielx hat geschrieben:"Bitweises umdrehen", lässt für mich keine Interpretation zu.
Be seeing you!
- George Mason
- Beiträge: 1175
- Registriert: 01.03.2006 22:55:19
- Lizenz eigener Beiträge: MIT Lizenz
Re: Bitweises umdrehen einer Datei: 010011->110010
Einfach jedes Bit negieren (NOT), fertig?
- George Mason
- Beiträge: 1175
- Registriert: 01.03.2006 22:55:19
- Lizenz eigener Beiträge: MIT Lizenz
Re: Bitweises umdrehen einer Datei: 010011->110010
wenn du jedes Bit einzeln umdrehst müsste es nicht so aussehen:Frosch6669 hat geschrieben:"Bitweises umdrehen einer Datei: 010011->110010"
010011 -> 101100
Re: Bitweises umdrehen einer Datei: 010011->110010
Ich denke, es ist sowas wie "spiegeln" gemeint...George Mason hat geschrieben:Einfach jedes Bit negieren (NOT), fertig?
Code: Alles auswählen
$ echo -n abcdef | rev
fedcba
- George Mason
- Beiträge: 1175
- Registriert: 01.03.2006 22:55:19
- Lizenz eigener Beiträge: MIT Lizenz
Re: Bitweises umdrehen einer Datei: 010011->110010
Ein bit kann aber doch nur 1 oder 0 sein.
- Six
- Beiträge: 8071
- Registriert: 21.12.2001 13:39:28
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Siegburg
Re: Bitweises umdrehen einer Datei: 010011->110010
Deswegen meine Frage, will er eine Binärdatei oder eine Zeichenkette bearbeiten. Eine Zeichenkette kann man sinnvoll so wie im Beispiel umdrehen:
ABC -> CBA
Eine Binärdatei kann man so nicht sinnvoll umdrehen, stattdessen würde man sie bitweise maskieren (geht mit meinem Beispiel halt nicht):
ABC -> (-A)(-B)(-C)
Und das ist halt nicht das gleiche.
EDIT: Vielleicht wäre es schlauer gewesen, wenn ich gefragt hätte, ob er Bits oder eine Zeichenkette bearbeiten will.
ABC -> CBA
Eine Binärdatei kann man so nicht sinnvoll umdrehen, stattdessen würde man sie bitweise maskieren (geht mit meinem Beispiel halt nicht):
ABC -> (-A)(-B)(-C)
Und das ist halt nicht das gleiche.
EDIT: Vielleicht wäre es schlauer gewesen, wenn ich gefragt hätte, ob er Bits oder eine Zeichenkette bearbeiten will.
Be seeing you!
Re: Bitweises umdrehen einer Datei: 010011->110010
Man kann eine Bitfolge doch trotzdem spiegeln. Ok, der Sinn erschliesst sich mir im Moment auch nicht.George Mason hat geschrieben:Ein bit kann aber doch nur 1 oder 0 sein.
Re: Bitweises umdrehen einer Datei: 010011->110010
Also für mich sieht es so aus, als wollte Frosch eine binäre Datei (eigentlich sind alle Dateien binär, aber egal) auf Bit-Ebene anders herum schreiben (bzw. "spiegeln"), also:
letztes Bit von A => erstes Bit von B
vorletztes Bit von A => zweites Bit von B
...
zweites Bit von A => vorletztes Bit von B
erstes Bit von A => letztes Bit von B
(A =original Datei und B = umgedrehte Datei)
Beispiel:
01001100000111110011101000000010010011101111111111111111
wird zu:
11111111111111110111001001000000010111001111100000110010
Gruß,
Daniel
letztes Bit von A => erstes Bit von B
vorletztes Bit von A => zweites Bit von B
...
zweites Bit von A => vorletztes Bit von B
erstes Bit von A => letztes Bit von B
(A =original Datei und B = umgedrehte Datei)
Beispiel:
01001100000111110011101000000010010011101111111111111111
wird zu:
11111111111111110111001001000000010111001111100000110010
Gruß,
Daniel
- Frosch6669
- Beiträge: 163
- Registriert: 02.07.2003 23:16:49
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Hamburg
-
Kontaktdaten:
Re: Bitweises umdrehen einer Datei: 010011->110010
Hallo,
ich melde mich mal wieder zu wort. also danke erstmal für die tollen vorschläge...
also ich will das so wie danielx es meint also spiegeln oder wie man auch sagen soll.
warum braucht man sowas?
wenn eine optische scheibe (z.b cd) von innen nach aussen geschrieben wird, kann mann sie auch von innen nach aussen lesen und alles ist ok.
wenn jetzt aber eine scheibe von aussen nach innen gelesen wird man aber nur von innen nach aussen schreiben kann, kann mann ja sehr viele nullen schreiben und dann mit dem eigentlichen inhalt spiegelverkehrt (siehe danielx) weiter machen. wird die scheibe jetzt gelesen wäre es so als hätte man sie von aussen beschrieben. (oder täusch ich mich?)
ich werde jetzt nochmal kurz den programmcode oben genau durchschauen ob der das tut.
es handelt sich um binärdaten! keine buchstaben kein ascii und keine zeilenweise lesbaren dinge.
...to be continued....
frosch
ich melde mich mal wieder zu wort. also danke erstmal für die tollen vorschläge...
also ich will das so wie danielx es meint also spiegeln oder wie man auch sagen soll.
warum braucht man sowas?
wenn eine optische scheibe (z.b cd) von innen nach aussen geschrieben wird, kann mann sie auch von innen nach aussen lesen und alles ist ok.
wenn jetzt aber eine scheibe von aussen nach innen gelesen wird man aber nur von innen nach aussen schreiben kann, kann mann ja sehr viele nullen schreiben und dann mit dem eigentlichen inhalt spiegelverkehrt (siehe danielx) weiter machen. wird die scheibe jetzt gelesen wäre es so als hätte man sie von aussen beschrieben. (oder täusch ich mich?)
ich werde jetzt nochmal kurz den programmcode oben genau durchschauen ob der das tut.
es handelt sich um binärdaten! keine buchstaben kein ascii und keine zeilenweise lesbaren dinge.
...to be continued....
frosch
-
- Beiträge: 3472
- Registriert: 30.11.2005 10:32:22
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Wald
Re: Bitweises umdrehen einer Datei: 010011->110010
Da solltest du aber vorher klären in welchen Blockgrößen von einer Cd gelesen bzw. geschrieben wird, ich denke nicht, dass das bitweise passiert. Ist dass Szenario was du beschreibst das konkrete Problem oder nur ein vereinfachtes Beispiel?
Re: Bitweises umdrehen einer Datei: 010011->110010
Von Innen nach Außen von Außen nach Innen
Da komm ich jetzt mal gar nicht mit...
Wie die Informationen letztendlich auf den Datenträger geschrieben werden, regelt alleine die Laufwerksfirmware, nebenbei ist dies alles Standardisiert.
@Frosch6669 was hast du denn genau vor? Das klingt ziemlich verworren.
Da komm ich jetzt mal gar nicht mit...
Wie die Informationen letztendlich auf den Datenträger geschrieben werden, regelt alleine die Laufwerksfirmware, nebenbei ist dies alles Standardisiert.
@Frosch6669 was hast du denn genau vor? Das klingt ziemlich verworren.
Gruß cirrussc
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl
Re: Bitweises umdrehen einer Datei: 010011->110010
me too.cirrussc hat geschrieben:Da komm ich jetzt mal gar nicht mit...
Re: Bitweises umdrehen einer Datei: 010011->110010
Vielleicht will er 'ne WindowsCD rückwärts auslesen und sucht die satanischen Verse da herinnen... O:-)
Re: Bitweises umdrehen einer Datei: 010011->110010
Ahh!yeti hat geschrieben:Vielleicht will er 'ne WindowsCD rückwärts auslesen und sucht die satanischen Verse da herinnen... O:-)
Gruß cirrussc
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl
- Frosch6669
- Beiträge: 163
- Registriert: 02.07.2003 23:16:49
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Hamburg
-
Kontaktdaten:
Re: Bitweises umdrehen einer Datei: 010011->110010
Hallo,
das szenario ist das konkrete problem. egab ob blockweise oder nicht, die blöcke werde ja auch von der anderen seite aus gelesen...
bsp (vier ziffern seien ein block) 1111 0000 1100 -> 0011 0000 1111 also egabl ob bit oder blockweise...
gruß frosch
das szenario ist das konkrete problem. egab ob blockweise oder nicht, die blöcke werde ja auch von der anderen seite aus gelesen...
bsp (vier ziffern seien ein block) 1111 0000 1100 -> 0011 0000 1111 also egabl ob bit oder blockweise...
gruß frosch
Re: Bitweises umdrehen einer Datei: 010011->110010
Könnte ein kräftiger Schubs in Richtung Endianess [1] hilfreich sein?
[1] http://de.wikipedia.org/wiki/Byte-Reihenfolge
[1] http://de.wikipedia.org/wiki/Byte-Reihenfolge
Gruß cirrussc
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl
Re: Bitweises umdrehen einer Datei: 010011->110010
Wie machst du das denn genau (also das mit dem Block rückwärts lesen), mit welcher Hardware?Frosch6669 hat geschrieben:egab ob blockweise oder nicht, die blöcke werde ja auch von der anderen seite aus gelesen...
Auch bezüglich Fehlerkorrektur, das ist für mich jetzt auf den ersten Blick nicht vorstellbar.
Gruß,
Daniel
- George Mason
- Beiträge: 1175
- Registriert: 01.03.2006 22:55:19
- Lizenz eigener Beiträge: MIT Lizenz
Re: Bitweises umdrehen einer Datei: 010011->110010
Also sowas vielleicht:
p = (Position des letzten Bit einer Datei <file1>)
w = (Wert des Bit Nr. p einer Datei <file1>)
schreibe w in die Datei <file2> an die Position 1
p=p-1
w = (Wert des Bit Nr. p einer Datei <file1>)
schreibe w in die Datei <file2> an die Position 2
p=p-1
w = (Wert des Bit Nr. p einer Datei <file1>)
schreibe w in die Datei <file2> an die Position 3
usw. (am besten ne Schleife machen, so oft durchlaufen lassen, bis p=0 also bis zum ersten Bit der Datei <file1>)
p = (Position des letzten Bit einer Datei <file1>)
w = (Wert des Bit Nr. p einer Datei <file1>)
schreibe w in die Datei <file2> an die Position 1
p=p-1
w = (Wert des Bit Nr. p einer Datei <file1>)
schreibe w in die Datei <file2> an die Position 2
p=p-1
w = (Wert des Bit Nr. p einer Datei <file1>)
schreibe w in die Datei <file2> an die Position 3
usw. (am besten ne Schleife machen, so oft durchlaufen lassen, bis p=0 also bis zum ersten Bit der Datei <file1>)
Re: Bitweises umdrehen einer Datei: 010011->110010
Ja, das Vorgehen ist klar, nur ist es nicht so einfach möglich auf Bit-Ebene zu arbeiten, das geht erstmal nur auf Byte-Ebene.George Mason hat geschrieben:Also sowas vielleicht:
Man könnte z.B. bei C bitweises UND zum Auswählen des gewünschten Bits und bitweises ODER zum Setzen des gewünschten Bits verwenden.
Evtl. ist auch ein Verschiebeoperator ganz gut zu gebrauchen und dann eben noch fopen, fseek u.s.w.
Damit hat man schnell ein Programm geschrieben, welches eine Datei "anders herum schreibt", "spiegelt" oder wie man das jetzt nennen will.
Die Frage ist nur, ob sich damit überhaupt das Vorhaben von Frosch realisieren lässt...
Gruß,
Daniel
Re: Bitweises umdrehen einer Datei: 010011->110010
Viel schlimmer ist, wenn man sie vorwärts abspielt. Dann wird nämlich Windows installiert.yeti hat geschrieben:Vielleicht will er 'ne WindowsCD rückwärts auslesen und sucht die satanischen Verse da herinnen... O:-)