char in bit und bit in char



  • Hi

    wenn ich eine datei einlese ist das kleinste was ich einlesen kann ja ein byte ( also char )

    wie kann ich jetzt die 8 bits auslesen und in ein feld von boolean speichern?

    kann mir einer helfen?

    THX

    Dagsta

    P.S.:oder ist es möglich 16 bits direct aus der datei zu lesen und in ein feld von boolean zu speichern?



  • Hi!
    Also mit dem Builder hab ich noch keine Bits rumgeschubst, kann also sein, das dass auch einfacher geht.
    Bastel dir für jedes der acht Bit eine Funktion die alle bis auf das zu Testende Bit zu Null maskiert (shifte es entsprechend hin und her) und sieh dir dann an ob der so enstandene Ausdruck ungleich Null ist. Wenn ja trägst du für das Bit was du gerade getestet hast in deinem Bitfeld eine 1 ein.



  • Dieser vorgang nennt sich maskieren benutz mal die Suchfunktion im ANSI-C Forum.

    -junix



  • nen schnelleren weg gibt es da nicht?

    ich kann mir vorstellen das wenn ich das bei einer 100Mb Datei für jeden bit mache das mein rechner da schon ne ganze weile dran sitzen wird

    Dagsta



  • Original erstellt von dagsta:
    nen schnelleren weg gibt es da nicht?

    Was heisst "Schneller"? Binäre Operationen sind extrem schnell (2-3 Takte vielleicht). Ausserdem versteh ich nicht ganz was du 100MByte-Weise in irgendwelche Booleans abfüllen willst. Wenn du sowas musst, dann würde ich dir empfehlen, dass du die Daten bei Bedarf ausliest und dann maskierst...

    Vielleicht gibst du auch etwas mehr von deinem Vorhaben preis. Vielleicht gibts ja nen besseren Weg das zu lösen was du vorhast.

    -junix



  • Eine andere Variante wäre die, dass du dich erst mal etwas über Digitaltechnik beliest. (Und/Oder-Konjunktionen sind die Lösung für dein im Subject des Threads erwähnten Problem)
    Hier findest du eine nette Liste mit diversen Grundlagenkursen.

    -junix



  • Also das Ziel ist sher sehr viele Bits einer Datei zu vertauschen!

    Dazu lese ich jeweils 256KB ein und speichere sie in einem Feld von Char
    jetzt kann ich ja ein feld von boolean mit den bits füllen rumtauschen und nachher wieder in die datei schreiben!

    Wenn ich das richtig verstanden habe, prüfe ich das 3. bit so:

    char: 0010 1100
    maske: 0010 0000

    DAS GANZE & VERKNÜPFT

    ergebniss: 0010 0000
    Da ergebniss != 0 ist der dritte bit eine 1 anderenfalls eine 0

    HABE ICH DAS RICHTIG VERSTANDEN?

    THX

    Dagsta



  • bitschifften und masken hatte ich schon in der schule also das kann ich frage war nur ob es nicht ein bischen einfacher geht! aber wenn nicht dann nehme ich halt dieses verfahren!!!

    Hoffe das mein Beispeil oben richtig war!



  • richtig. Allerdings lässt sich das Ganze vemutlich ohne Booleans und einfach nur mit einigen erweiterten logischen Operatoren erledigen. Was verstehst du unter "Bit vertauschen"?

    -junix



  • Original erstellt von dagsta:
    [...]ob es nicht ein bischen einfacher geht![...]

    Was willst du denn nochmehr vereifachen? Was du machen willst kompliziert die Sache eher.
    Durch geschicktes maskieren kannst du jedes Bit eines bytes löschen oder setzen ohne de - völlig unnötigen - Weg über Booleans zu gehen.

    Original erstellt von dagsta:
    Hoffe das mein Beispeil oben richtig war!

    war es.

    -junix

    [ Dieser Beitrag wurde am 08.01.2003 um 10:49 Uhr von junix editiert. ]



  • Also ich will in weiteren schritten die datei verschlüsseln

    dazu nehme ich ein passwort und wenn da die 1. stelle 5 ist dann wird der 5 mit dem 10 und das 15 mit dem 20 bit vertauscht....!

    Beipiel

    0100 1011 0110 1001 1001 1100
    Tausche jedes 4 bit:
    0101 1010 0111 1000 1000 1101



  • Original erstellt von dagsta:
    **Also ich will in weiteren schritten die datei verschlüsseln

    dazu nehme ich ein passwort und wenn da die 1. stelle 5 ist dann wird der 5 mit dem 10 und das 15 mit dem 20 bit vertauscht....!
    **

    warum so kompliziert? kannst ja auch mit fixen schlüssel verknüpfen, alle bits shiften, swapen, was auch immer... aber boolean-feld brauchst du sicher nicht dafür



  • Er braucht auch für seine Bit-Tauscherei kein Boolean-Feld. Es reichen ca. 3 &-Verknüpfungen, 2 |-Verknüpfungen, 2 Masken und ein temporärwert. Und natürlich ein Schleifenkonstrukt.

    -junix



  • nein nein ich glaube ihr versteht mich falsch

    ich will nicht den wert vom 4 bit wechseln sondern den wert des 4 bits an die 8. stelle schreiben und den wert des 8. Bits and die 4 Stelle!

    Auserdem weiß ich vorher nicht welches passwort der user wählt kann also sein das jedes 4,7,3,5,9,2,6,8 Bit vertauscht werden muß da ist dann ein feld von boolean in dem ich rumtausche meiner meinung nach am besten geeignet!

    CU

    Dagsta



  • Original erstellt von dagsta:
    nein nein ich glaube ihr versteht mich falsch

    nö, wir haben dich absolut richtig verstanden. Nur brauchst du dazu kein feld von Booleans sondern wie ich geschrieben habe einige Masken und die Operatoren für das bitweise Oder und das Bitweise und... und weils auch klappen sollbrauchst du genau 1 Byte als temporärspeicher.

    -junix



  • Also irgentwie verstehe ichncht so genau was du meinst!

    momentan mache ich es so:

    bits[16] //enthält 16 bits

    temp = Bits[4];
    bits[4] = Bits[8];
    Bits[8] = Temp;

    jetzt nur als beispiel das da noch schleifen drum sind etc ist klar



  • Du kennst dich aber mit der Technik des Maskierens aus, ja?

    beantworte mal folgende Fragen, vielleicht fällt dir die Lösung dann leichter:

    1. Welche Maske musst du setzen um nur Bit 4 zu erhalten?
    2. Welche Maske musst du setzen um nur Bit 8 zu erhalten?
    3. Wie müssen die Masken verknüpft sein?
    4. Was für eine Maske (Operand + MAske) musst du setzen damit alle Bits ausser Bit 4 im Resultat erscheinen?
    5. Was für eine maske (Operand + Maske) musst du setzen damit alle bits ausser Bit 8 im Resultat erscheinen?

    -junix



  • Original erstellt von junix:
    **Du kennst dich aber mit der Technik des Maskierens aus, ja?

    beantworte mal folgende Fragen, vielleicht fällt dir die Lösung dann leichter:

    1. Welche Maske musst du setzen um nur Bit 4 zu erhalten?
    2. Welche Maske musst du setzen um nur Bit 8 zu erhalten?
    3. Wie müssen die Masken verknüpft sein?
    4. Was für eine Maske (Operand + MAske) musst du setzen damit alle Bits ausser Bit 4 im Resultat erscheinen?
    5. Was für eine maske (Operand + Maske) musst du setzen damit alle bits ausser Bit 8 im Resultat erscheinen?

    -junix**

    1: & 0001 0000
    2: & 0000 0001
    3: Wie schon gezeigt UND
    4: Meinst du mit nicht erscheinen ist immer 0 oder wie?
    5: "

    WENN DU DAS MEINST DANN:
    4: & 1110 1111
    5: & 1111 1110

    [ Dieser Beitrag wurde am 08.01.2003 um 11:31 Uhr von dagsta editiert. ]



  • Zwei dinge:
    1. Deine Antworten sind richtig.
    2. http://learn.to/quote - Schau da mal vorbei.

    Aber zurück zum Thema. Gut. Jetzt hast du alles um das Ganze neu zusammenzusetzen. Denk mal etwas nach. Kommst du drauf?

    -junix



  • Ich versuche es!

    Komm mal in ICQ habe dich gerade geaddet!

    da kann ich dir dann meine Lösungsvorschläge sagen!

    Noch eine Frage!

    ist es mit der Lösung die ich finden soll Möglich die bitts zu vertauschen ohne die beiden auszulesen?

    und willst du das ich für jede zahl die das Passwort haben kann eine eigene tauschfunktion schreibe?
    wie stellst du dir das vor?
    wenn ich immer das 4. Bit tauschen müste ok aber es kann ja auch das 3,6,... sein das weis ich ja nicht!
    THX

    Dagsta

    [ Dieser Beitrag wurde am 08.01.2003 um 11:43 Uhr von dagsta editiert. ]


Anmelden zum Antworten