nochma Bitrotation (und Strings)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
SäsH
Beiträge: 8
Registriert: 01.09.2004 02:53
Wohnort: Nähe Stuggi

Beitrag von SäsH »

wie 7 byte nur erlaubt? ???? 7 bit oder?

1 Nibble = 4bit
1 byte = 2 Nibble = 8bit
1 Word = 2 byte = 4 Nibble = 16bit
1 Double Word = 2 Word = 4 byte = 8 Nibble = 32bit
1 Long Word = 2 Double Word = 4 Word = 8 byte = 16 Nibble = 64bit

und bei allen "signed"-variablen ist immer das vorderste (ganz links) bit für das vorzeichen verantwortlich. wird das gesetzt hast du ne negative zahl.
die zahl %0000 1111 wäre 15, %1000 1111 ist aber nicht -15.

ich glaub dein problem liegt wahrscheinlich nicht im $FF was ein ganzes byte wäre, es liegt im vordersten bit.

deßhalb glaub ich, reicht das hier:

Code: Alles auswählen

a.b=(a.b<<1)>>1 ; Für Byte
a.l=(a.l<<1)>>1 ; Für Long
oder das:

Code: Alles auswählen

a.b=a.b & %0111 1111 ;Für Byte 
so sollten es nicht mehr passieren das die werte negativ werden...
Zuletzt geändert von SäsH am 09.09.2004 01:58, insgesamt 5-mal geändert.
Der Mensch kann zwar tun was er will, aber nicht wollen was er will.
Dieser Umstand bewahrt mich davor die Handlungen meiner Mitmenschen allzuernst zu nehmen, und den guten Humor zu verlieren.
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

Hier mal ne ganz Unkonventionelle Methode 8)

Code: Alles auswählen

a=$fffff2
If a>=$f00000
 a=a-$f00000
   If a>=$0f0000
    a=a-$0f0000
     If a>=$00f000
      a=a-$00f000
        If a>=$000f00
         a=a-$000f00
          If a>=$0000f0
           a=a-$0000f0
          EndIf
        EndIf 
     EndIf
  EndIf
EndIf
Debug Hex(a)
Debug a
wenn werte bis 255 benötgt werden

Code: Alles auswählen

a=$fffff0
If a>$ff0000
 a=a-$ff0000
  If a>$00ff00
   a=a-$00ff00
  EndIf
EndIf
Debug Hex(a)
Debug a
Zuletzt geändert von SoS am 09.09.2004 13:46, insgesamt 4-mal geändert.
Benutzeravatar
SäsH
Beiträge: 8
Registriert: 01.09.2004 02:53
Wohnort: Nähe Stuggi

Beitrag von SäsH »

@SOS: und was passiert bei a=$f00000 ??
Der Mensch kann zwar tun was er will, aber nicht wollen was er will.
Dieser Umstand bewahrt mich davor die Handlungen meiner Mitmenschen allzuernst zu nehmen, und den guten Humor zu verlieren.
Benutzeravatar
SoS
Beiträge: 340
Registriert: 29.08.2004 09:31
Kontaktdaten:

Beitrag von SoS »

überredet,code geändert :D
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag von horst »

Sunny hat geschrieben:Also aus $FFFFFC0 soll $C0 werden, und wieder in einer Variable gespeichert werden, ..
$FFFFFC0 & $FF ergibt $C0

Mit der AND-Verknüpfung (& in PB) bleiben alle Bits übrig, die beim ersten UND zweiten Wert an sind. Mit & $FF wird also immer das niedrig-wertige Byte rausgezogen.
horst
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

jeah, vielen Dank, ihr habt mir da sehr geholfen. ;)

Mal sehen wie so der Contest ausgehen wird.
(Ihr müsst wissen, es geht in einem anderen Forum darum, einen String per spezielle XOR Verknüpfung und 4facher Bitverschiebung zu verschlüsseln. Dabei gehts aber hautpsächlich nicht um das Können, (sonst wäre hier Nachfragen ja unfair) sondern eigentlich darum, es mit der eigenen Programmiersprache zu lösen und entweder möglichst elegant oder möglicht kleinen Code zu haben. Wir haben da dann etwa C++, Delphi, PureBasic, VB, QBasic, Java und sowas dabei. Mal sehen was da rauskommt, und wie klein mein Code dann tatsächlich ist im Vergleich zu den anderen Sprachen)
Benutzeravatar
YoshiGreen
Beiträge: 11
Registriert: 08.09.2004 12:59
Wohnort: Layer 12
Kontaktdaten:

Beitrag von YoshiGreen »

ARGH! Aso ih dreh hier durch könnte sich bitte einmal jemand diesen Code ansehen....

Code: Alles auswählen

;Dieses Programm wurde für den Programmierkontest geschrieben
;Es verschlüsselt einen beliebigen Text rückgreifend kaskadierent mit XOR und gibt in dann aus
;Nicht druckbare Zeichen werden hierbei mit "." dargestellt.

;Text einspeichern, Länge festellen und Arrays dementsprechend anpassen
Text.s = "Dies ist der zu verschluesselnde Text"
Laenge.l=Len(Text)
Dim TextZeichen.s(Laenge)
Dim neuesZeichen.s(Laenge)

;einzelne Zeichen in den Array speichern, nicht druckbare Zeichen durch "." ersetzen
For X = 1 To Laenge
  TextZeichen(X) = Mid(Text,X,1)
  Temp.l = Asc(TextZeichen(X))
  
  If Temp < 33 Or Temp > 126
    TextZeichen(X) = "."
  EndIf

Next X

;Beginn der For:Next Schleife, Y Zeichen ist das Zeichen vor dem X, im Falle X=0 wird Y das letzte Zeichen des Textes
For X = 1 To Laenge
  Y = X-1
  If Y = 0
    Y = Laenge
  EndIf

;Temporäre Zeichen einspeichern....
TempX.s = TextZeichen(X)
TempY.s = TextZeichen(Y)
Debug TempX
Debug TempY

;ASCII Wert der Zeichen ermittlen
TempX = Str(Asc(TempX))
TempY = Str(Asc(TempY))
Debug TempX
Debug TempY

;ASCII Wert in binär Zahlen mit vorstehender 0 umwandeln
TempX = RSet(Bin(Val(TempX)),8,"0")
TempY = RSet(Bin(Val(TempY)),8,"0")
Debug TempX
Debug TempY

;Nur als Test neue Longs mit dem Wert der vorherigen Variablen, damit im nächsten Schritt kein Val() verwendet werden muss
vTempX = Val(TempX)
vTempY = Val(TempY)

;Xor-Verknüpfung ((WARUM TAUCHT HIER ALLES MÖGLICHE NUR NICH 0 UND 1?!?!?!?!?!))
TempZ = vTempX!vTempY

neuesZeichen(X) = RSet(Str(Val(TempX)!Val(TempY)),8,"0")
Debug TempZ

Delay(5)

Next X

For X = 1 To Laenge
  Debug TextZeichen(X)
  Debug neuesZeichen(X)
Next X
In meiner ersten XOR Berechung bekomm ich das raus: 01000100 XOR 01110100 = 207742??! @___@
Ich hab keine Ahnung woran das liegt, aber ich geh mal stark davon aus, dass dies falsch ist!

Vielleicht kann mir jemand helfen, ich hau jetzt ersma weiter meinen Kopf gegen Bäume :cry:

Edit: Achja, ich hab hier mal nen Code geschrieben, wo das funktioniert oO

Code: Alles auswählen

Global X.s
Global Y.s
Global Z.s

Procedure Debugg()
Debug X
Debug Y
EndProcedure

X="X"
Y="Y"
 Debugg()

X = Str(Asc(X))
Y = Str(Asc(Y))
 Debugg()
 
X = RSet(Bin(Val(X)),8,"0")
Y = RSet(Bin(Val(Y)),8,"0")
 Debugg()
vX = Val(X)
vY = Val(Y)
Z = RSet(Str(vX!vY),8,"0")
Debug Z
No matter where you are, everyone is always connected!
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

[IM RING-FORUM HAB ICH DIR SPEZIELL ZU DEINEM FEHLER WAS GESCHRIEBEN, FALLS DU DA NOCH NICHT GESCHAUT HAST, DORT ERSTMAL NACHSEHEN!]


Also mein Fehler anfangs war, dass ich in Binarys umgerechnet habe. Das machst du hier auch. Man brauch eigentlich niergends hier binarys.
Das hat dann zur Folge, dass die Variable vom Wert 68 plötzlich, weil in Binary gerechnet, 01000100 ist. Das ist zwar der Binary Wert dafür, aber mit diesem darf man da natürlich nicht rechnen.^^

Mach es einfach so:

b.b = ASC("D") ! asc("t")
Mehr ist das XOR nicht. Nix mit Binary.
Dann einfach diesen Wert als Hex in einem String speichern. Also

string.s = string.s + hex(b.b)

Dann noch ein ROR, also schreibst du dann:

ROR b,4 (wichtig, die Assemblerunterstützung muss angestellt sein, bei den Compiler-Optionen ;))

Das musst du nun mit allen Werten machen, wobei sich der 2te XOR Wert ja immer nach dem letzten ersten Wert richtet. Beim nächsten XOR wäre der 2te also "D", danach "i", dann "e". Sowas lässt sich per For-Schleife recht gut machen:

[/code]start.s="Dies ist der zu verschluesselnde Text"
For x=1 To Len(start)
;...
next x

Das wars auch schon. Und da brauch man auch keinen Array. ;)
Es geht ja auch darum, den kürzesten Sourcecode zu haben.
Benutzeravatar
YoshiGreen
Beiträge: 11
Registriert: 08.09.2004 12:59
Wohnort: Layer 12
Kontaktdaten:

Beitrag von YoshiGreen »

Woah ruhig Sunny, ganz ruhig. Wenn du mal auf meine Postingszeiten schaust, hab ich im Ring ne 3/4 Stunde nach dem Post hier gefragt.... nich aufregen.... immer sonnig bleiben ;)

Auf jedenfall hier noch einma dankschön für die Hilfe, aber nochmal ne rein rethorische Frage: Warum kommt bei meiner berechnung irgendwas mit 25wat weiß ich raus, im binären Zahlensystem gibbet do nur 0 und 1 oda?! O.O

Achja und noch ne Frage, nur mal theoretisch, was ist der Gegenbefehl zu Bin() aso wie kann ich aus ner binären Zahl wieder eine "normale" machen?
No matter where you are, everyone is always connected!
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

schreib einfach ein % vor die Binary dann ist sie normal... Das geht aber nur im Quelltext direkt, einer Variable kannst du kein % on the fly im Programm heraus vorraussetzen...
Aber eigentlich muss man da überhaupt nicht in binärwerte umrechnen, daher lass das lieber bleiben.
Antworten