Seite 1 von 2

ASCII Zeichen werden nicht erkannt

Verfasst: 03.03.2008 22:51
von Tompazi
Ich programmiere gerade einen File En/Decoder (einen ziemlich simplen aber egal)
Jeden falls werden einige Zeichen beim Decodieren nicht erkannt.
Wenn ich in meine File (z.B.: Ah) schreibe es encodiere (macht es brav) dann wieder Decodiere kommt das falsche raus (z.B: Ah -> AA)
der Debugger spuckt das aus (beim Decodieren für Ah)

Code: Alles auswählen

37
A
-16
A
Immer wenn der Debugger eine negative Zahl ausspuckt wird der vorherige erkannte Buchstabe verwendet. Muss ich jetzt alle Zeichen die nicht erkannt werden so ändern, dass sie erkannt werden oder geht das auch anders?

hier mal der Code:

Code: Alles auswählen

If OpenWindow(0,0,0,100,100,"File Encoder",  #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
ButtonGadget(0,5,5,50,20,"load file")
ButtonGadget(1,5,30,50,20,"encode")
ButtonGadget(2,5,55,50,20,"decode")

Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()

Case 0

file$ = OpenFileRequester("Select a file","","Text (*.txt)|*.txt",0)

Case 1

If file$

OpenFile(0,file$)
l = Lof(0)

For a = 1 To l

char = ReadCharacter(0)

If     char = 65 : char$ = "%"
ElseIf char = 66: char$ = "$"
ElseIf char = 67 : char$ = "&"
ElseIf char = 68 : char$ = "!"
ElseIf char = 69 : char$ = "("
ElseIf char = 70 : char$ = ")"
ElseIf char = 71 : char$ = "="
ElseIf char = 72 : char$ = "?"
ElseIf char = 73 : char$ = "/"
ElseIf char = 74 : char$ = "["
ElseIf char = 75 : char$ = "{"
ElseIf char = 76 : char$ = "]"
ElseIf char = 77 : char$ = "}"
ElseIf char = 78 : char$ = "²"
ElseIf char = 79 : char$ = "³"
ElseIf char = 80 : char$ = "\"
ElseIf char = 81 : char$ = "°"
ElseIf char = 82 : char$ = "^"
ElseIf char = 83 : char$ = "#"
ElseIf char = 84 : char$ = "'"
ElseIf char = 85 : char$ = "+"
ElseIf char = 86 : char$ = "*"
ElseIf char = 87 : char$ = "~"
ElseIf char = 88 : char$ = "-"
ElseIf char = 89 : char$ = "."
ElseIf char = 90 : char$ = ":"

ElseIf char = 49 : char$ = "¿"  ;;191
ElseIf char = 50 : char$ = "ƒ"  ;;131
ElseIf char = 51 : char$ = "Æ"  ;;198
ElseIf char = 52 : char$ = "§"  ;;167
ElseIf char = 53 : char$ = ","  ;; 44
ElseIf char = 54 : char$ = "¦"  ;;166
ElseIf char = 55 : char$ = "Þ"  ;;222
ElseIf char = 56 : char$ = ";"  ;; 59
ElseIf char = 57 : char$ = "Î"  ;;206
ElseIf char = 48 : char$ = "±"  ;;177

ElseIf char = 97 : char$ = "<"  ;; 60
ElseIf char = 98 : char$ = "‰"  ;;137 
ElseIf char = 99 : char$ = "›"  ;;155
ElseIf char = 100 : char$ = "@" ;; 64
ElseIf char = 101 : char$ = "µ" ;;181
ElseIf char = 102 : char$ = "_" ;; 95
ElseIf char = 103 : char$ = "|" ;;124
ElseIf char = 104 : char$ = "ð" ;;240
ElseIf char = 105 : char$ = "‡" ;;135
ElseIf char = 106 : char$ = "ø" ;;248
ElseIf char = 107 : char$ = "†" ;;134
ElseIf char = 108 : char$ = "¤" ;;164
ElseIf char = 109 : char$ = "¶" ;;182
ElseIf char = 110 : char$ = "¯" ;;175
ElseIf char = 111 : char$ = "×" ;;215
ElseIf char = 112 : char$ = "«" ;;171
ElseIf char = 113 : char$ = "ª" ;;170
ElseIf char = 114 : char$ = " " ;; 32
ElseIf char = 115 : char$ = "’" ;;146
ElseIf char = 116 : char$ = "•" ;;149
ElseIf char = 117 : char$ = "®" ;;174
ElseIf char = 118 : char$ = " " ;;160
ElseIf char = 119 : char$ = "»" ;;187
ElseIf char = 120 : char$ = "¥" ;;165
ElseIf char = 121 : char$ = "¬" ;;172
ElseIf char = 122 : char$ = "æ" ;;230

ElseIf char = 32 : char$ = "©"  ;;169
ElseIf char = 13 : char$ = "¢"  ;;162
ElseIf char = 33 : char$ = "÷"  ;;247
ElseIf char = 63 : char$ = "‹"  ;;139
ElseIf char = 40 : char$ = "¨"  ;;168
ElseIf char = 41 : char$ = "¼"  ;;188
ElseIf char = 46 : char$ = "€"  ;;128
Else
EndIf

text$ = text$ +  char$ 

Next a
CloseFile(0)
CreateFile(0,file$)
WriteString(0,text$)
CloseFile(0)
text$ = ""
Else

MessageRequester("No file!!","No file loaded")

EndIf


Case 2

If file$
OpenFile(0,file$)
l = Lof(0)

For a = 1 To l

char = ReadCharacter(0)

If     char =  37 : char$ = "A"
ElseIf char =  36 : char$ = "B"
ElseIf char =  38 : char$ = "C"
ElseIf char =  33 : char$ = "D"
ElseIf char =  40 : char$ = "E"
ElseIf char =  41 : char$ = "F"
ElseIf char =  61 : char$ = "G"
ElseIf char =  63 : char$ = "H"
ElseIf char =  47 : char$ = "I"
ElseIf char =  91 : char$ = "J"
ElseIf char = 123 : char$ = "K"
ElseIf char =  93 : char$ = "L"
ElseIf char = 125 : char$ = "M"
ElseIf char = 178 : char$ = "N"
ElseIf char = 179 : char$ = "O"
ElseIf char =  92 : char$ = "P"
ElseIf char = 176 : char$ = "Q"
ElseIf char =  94 : char$ = "R"
ElseIf char =  35 : char$ = "S"
ElseIf char =  39 : char$ = "T"
ElseIf char =  43 : char$ = "U"
ElseIf char =  42 : char$ = "V"
ElseIf char = 126 : char$ = "W"
ElseIf char =  45 : char$ = "X"
ElseIf char =  46 : char$ = "Y"
ElseIf char =  58 : char$ = "Z"

ElseIf char = 191 : char$ = "1"  ;;191
ElseIf char = 131 : char$ = "2"  ;;131
ElseIf char = 198 : char$ = "3"  ;;198
ElseIf char = 167 : char$ = "4"  ;;167
ElseIf char =  44 : char$ = "5"  ;; 44
ElseIf char = 166 : char$ = "6"  ;;166
ElseIf char = 222 : char$ = "7"  ;;222
ElseIf char =  59 : char$ = "8"  ;; 59
ElseIf char = 206 : char$ = "9"  ;;206
ElseIf char = 177 : char$ = "0"  ;;177

ElseIf char =  60 : char$ = "a" ;; 60
ElseIf char = 137 : char$ = "b" ;;137 
ElseIf char = 155 : char$ = "c" ;;155
ElseIf char =  64 : char$ = "d" ;; 64
ElseIf char = 181 : char$ = "e" ;;181
ElseIf char =  95 : char$ = "f" ;; 95
ElseIf char = 124 : char$ = "g" ;;124
ElseIf char = 240 : char$ = "h" ;;240
ElseIf char = 135 : char$ = "i" ;;135
ElseIf char = 248 : char$ = "j" ;;248
ElseIf char = 134 : char$ = "k" ;;134
ElseIf char = 164 : char$ = "l" ;;164
ElseIf char = 182 : char$ = "m" ;;182
ElseIf char = 175 : char$ = "n" ;;175
ElseIf char = 215 : char$ = "o" ;;215
ElseIf char = 171 : char$ = "p" ;;171
ElseIf char = 170 : char$ = "q" ;;170
ElseIf char =  32 : char$ = "r" ;; 32
ElseIf char = 146 : char$ = "s" ;;146
ElseIf char = 149 : char$ = "t" ;;149
ElseIf char = 174 : char$ = "u" ;;174
ElseIf char = 160 : char$ = "v" ;;160
ElseIf char = 187 : char$ = "w" ;;187
ElseIf char = 165 : char$ = "x" ;;165
ElseIf char = 172 : char$ = "y" ;;172
ElseIf char = 230 : char$ = "z" ;;230

ElseIf char = 169 : char$ = " "  ;;169
ElseIf char = 162 : char$ = Chr(13);;162
ElseIf char = 247 : char$ = "!"  ;;247
ElseIf char = 139 : char$ = "?"  ;;139
ElseIf char = 168 : char$ = "("  ;;168
ElseIf char = 188 : char$ = ")"  ;;188
ElseIf char = 128 : char$ = "."  ;;128
Else
EndIf

text$ = text$ +  char$ 
Debug char
Debug char$
Next a
CloseFile(0)
CreateFile(0,file$)
WriteString(0,text$)
CloseFile(0)
text$ = ""
Else

MessageRequester("No file!!","No file loaded")

EndIf

EndSelect
EndSelect

Until Event = #PB_Event_CloseWindow
Else
MessageRequester("ERROR!","ERROR!")
EndIf
Danke Tompazi

Verfasst: 03.03.2008 23:02
von AND51
Sorry, ich kann dir nicht direkt helfen, habe deinen Code nur überflogen und da drängt sich mir die Frage auf:
Schon mal was von Select/Case gehört? Das erspart dir das viele ElseIf... :)

Verfasst: 03.03.2008 23:06
von Tompazi
Ja von select und case hab schon mal was gehört (ich benutze sie ja auch bei meinem Code) aber wie soll ich damit die ganzen Elseifs erstezen??? :shock:

Danke Tompazi

Re: ASCII Zeichen werden nicht erkannt

Verfasst: 03.03.2008 23:07
von Kiffi
Tompazi hat geschrieben:Wenn ich in meine File (z.B.: Ah) schreibe es encodiere (macht es brav) dann wieder Decodiere kommt das falsche raus (z.B: Ah -> AA)
bei mir nicht: Ah -> %ð -> Ah

Grüße ... Kiffi

Verfasst: 03.03.2008 23:12
von Tompazi
also bei mir (ich habs jetzt nochmal versucht) kommt AA raus (aknn das daran liegen das ich Windows Vista habe :| :oops: :cry:

so wie immer? :evil:

Danke Tompazi

Verfasst: 03.03.2008 23:16
von walker
... mit ReadCharacter() liet Du tatsächlich nur 1 (in Worten ein ) Zeichen... wenn du also so etwas wie -16 da stehen hast,
wird davon zuerst mal nur das - gelesen(!) danach die 1 und dann die 6... eine Abfrage auf -16 würde somit nie ein positives Ergebnis bekommen.

Besser wäre ReadString() da hiermit bis zum Ende der Zeile gelesen wird und der Wert -16 als ganzes ankommt.... :wink:

Verfasst: 03.03.2008 23:21
von Kiffi
Tompazi hat geschrieben:aknn das daran liegen das ich Windows Vista habe
bff, keine Ahnung, habe kein Vista, aber eigentlich eher nicht.

So seltsam und optimierungspflichtig Dein Code auch sein mag: 'Ah' sollte
auch bei Dir korrekt encoded und decoded werden.

Ich vermute eher, dass Du u.U. die falsche Datei kontrollierst(?)

Grüße ... Kiffi

Verfasst: 03.03.2008 23:25
von Tompazi
@walker Du missverstehst das Problem
wenn in der Datei steht Ah und ich Encodiere kommt wie bei mir Kiffi %ð
wenn ich jetzt decodiere wird das % als 37 gelesen was korrekt ist. aber das ð wird als -16 gelesen obwohl es 240 sein sollte.
Readstring kann ich nicht verwenden weil dann würde mein Programm nich viel Sinn ergeben.

lG Tompazi

Verfasst: 03.03.2008 23:31
von Tompazi
@Kiffi nein es ist 100% so kann auch ein Video drehen <)

vielleicht weil ich noch immer die Demo Version habe?
So seltsam und optimierungspflichtig Dein Code auch sein mag
was soll den das heißen? :mrgreen:

Danke Tompazi

Verfasst: 03.03.2008 23:34
von Kaeru Gaman
aber das ð wird als -16 gelesen obwohl es 240 sein sollte.
wenn du es in bytes packst, dann bekommst du vorzeichenbehaftete werte.
ein signed Byte kann zahlen von -128 bis 127 darstellen.
um das vorzeichen zu eliminieren, musst du als transfervariablen Word oder Long benutzen,
weil die so große werte halten können, ohne das 8te bit als vorzeichen zu interpretieren.

meine Güte, das schreib ich dieses Jahr schon mindestens zum dritten mal...
ich sollte echt mal ne Erklärung in die FAQ sertzen, oder steht da am end schon was?