Bitweises umdrehen einer Datei: 010011->110010

Du suchst ein Programm für einen bestimmten Zweck?
Benutzeravatar
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

Beitrag von Frosch6669 » 22.10.2008 21:16:00

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

Benutzeravatar
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

Beitrag von Six » 23.10.2008 09:32:46

Willst du eine Binärdatei umdrehen oder nur eine Zeichenkette?
Be seeing you!

Danielx
Beiträge: 6419
Registriert: 14.08.2003 17:52:23

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von Danielx » 23.10.2008 14:21:56

"Bitweises umdrehen", lässt für mich keine Interpretation zu. ;-)

yeti

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von yeti » 23.10.2008 15:38:33

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

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()
Das macht sowas:

Code: Alles auswählen

$ echo -ne '\x80\x40\x20\x10' | ./bitrev.py | od -tx1
0000000 08 04 02 01
0000004

Spasswolf
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

Beitrag von Spasswolf » 23.10.2008 16:43:27

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

Benutzeravatar
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

Beitrag von Six » 23.10.2008 17:16:06

Danielx hat geschrieben:"Bitweises umdrehen", lässt für mich keine Interpretation zu. ;-)
Da kann ich dir auch nicht helfen :P
Be seeing you!

Benutzeravatar
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

Beitrag von George Mason » 23.10.2008 17:17:23

Einfach jedes Bit negieren (NOT), fertig?

Benutzeravatar
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

Beitrag von George Mason » 23.10.2008 17:20:12

Frosch6669 hat geschrieben:"Bitweises umdrehen einer Datei: 010011->110010"
wenn du jedes Bit einzeln umdrehst müsste es nicht so aussehen:

010011 -> 101100

yeti

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von yeti » 23.10.2008 17:26:32

George Mason hat geschrieben:Einfach jedes Bit negieren (NOT), fertig?
Ich denke, es ist sowas wie "spiegeln" gemeint...

Code: Alles auswählen

$ echo -n abcdef | rev
fedcba
...aber nicht mit Chars, sondern auf Bitebene...

Benutzeravatar
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

Beitrag von George Mason » 23.10.2008 17:34:02

Ein bit kann aber doch nur 1 oder 0 sein.

Benutzeravatar
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

Beitrag von Six » 23.10.2008 17:41:10

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.
Be seeing you!

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von 123456 » 23.10.2008 17:50:19

George Mason hat geschrieben:Ein bit kann aber doch nur 1 oder 0 sein.
Man kann eine Bitfolge doch trotzdem spiegeln. Ok, der Sinn erschliesst sich mir im Moment auch nicht.

Danielx
Beiträge: 6419
Registriert: 14.08.2003 17:52:23

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von Danielx » 23.10.2008 18:10:33

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

Benutzeravatar
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

Beitrag von Frosch6669 » 23.10.2008 19:17:33

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

Spasswolf
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

Beitrag von Spasswolf » 23.10.2008 19:48:05

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?

Benutzeravatar
cirrussc
Beiträge: 6582
Registriert: 26.04.2007 19:47:06
Lizenz eigener Beiträge: MIT Lizenz

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von cirrussc » 23.10.2008 19:53:10

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.
Gruß cirrussc
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von 123456 » 23.10.2008 19:58:25

cirrussc hat geschrieben:Da komm ich jetzt mal gar nicht mit...
me too.

yeti

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von yeti » 23.10.2008 20:00:06

Vielleicht will er 'ne WindowsCD rückwärts auslesen und sucht die satanischen Verse da herinnen... O:-)

Benutzeravatar
cirrussc
Beiträge: 6582
Registriert: 26.04.2007 19:47:06
Lizenz eigener Beiträge: MIT Lizenz

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von cirrussc » 23.10.2008 20:00:25

yeti hat geschrieben:Vielleicht will er 'ne WindowsCD rückwärts auslesen und sucht die satanischen Verse da herinnen... O:-)
Ahh!
Gruß cirrussc
--------------------
„Der Mensch steigert zur Zeit die Nutzung dessen, was seiner Willkür unterliegt - und kommt sich sehr klug dabei vor.“ H. Gruhl

Benutzeravatar
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

Beitrag von Frosch6669 » 23.10.2008 20:09:55

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

Benutzeravatar
cirrussc
Beiträge: 6582
Registriert: 26.04.2007 19:47:06
Lizenz eigener Beiträge: MIT Lizenz

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von cirrussc » 23.10.2008 20:14:28

Könnte ein kräftiger Schubs in Richtung Endianess [1] hilfreich sein?

[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

Danielx
Beiträge: 6419
Registriert: 14.08.2003 17:52:23

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von Danielx » 23.10.2008 20:15:52

Frosch6669 hat geschrieben:egab ob blockweise oder nicht, die blöcke werde ja auch von der anderen seite aus gelesen...
Wie machst du das denn genau (also das mit dem Block rückwärts lesen), mit welcher Hardware?
Auch bezüglich Fehlerkorrektur, das ist für mich jetzt auf den ersten Blick nicht vorstellbar.

Gruß,
Daniel

Benutzeravatar
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

Beitrag von George Mason » 23.10.2008 21:27:42

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

Danielx
Beiträge: 6419
Registriert: 14.08.2003 17:52:23

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von Danielx » 23.10.2008 22:11:35

George Mason hat geschrieben:Also sowas vielleicht:
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.

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

Benutzeravatar
smurffit
Beiträge: 164
Registriert: 22.08.2008 15:47:46
Lizenz eigener Beiträge: MIT Lizenz

Re: Bitweises umdrehen einer Datei: 010011->110010

Beitrag von smurffit » 23.10.2008 22:50:01

yeti hat geschrieben:Vielleicht will er 'ne WindowsCD rückwärts auslesen und sucht die satanischen Verse da herinnen... O:-)
Viel schlimmer ist, wenn man sie vorwärts abspielt. Dann wird nämlich Windows installiert. 8O

Antworten