[Monkey] ints werden falsch aus .txt gelesen

Übersicht Andere Programmiersprachen Allgemein

Neue Antwort erstellen

Dottakopf

Betreff: ints werden falsch aus .txt gelesen

BeitragFr, Jul 31, 2015 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitzer und Monkeys,

ich habe gerade das Flash Target eingerichtet. Unter HTML5 werden die informationen korrekt aus einer Datei gelesen unter Flash kommen aber falsch Werte raus.

ich denke das das Problem beim Offset in der Datei liegt, da die ersten werte die nicht in einer schleife gelsen werden korrekt einließt.

hier der Code dazu:

Code: [AUSKLAPPEN]


Local charHeight = fFontConf.PeekByte(0) 'wird korrekt gelesen
Local charMaskR = fFontConf.PeekByte(1)
Local charMaskG = fFontConf.PeekByte(2)
Local charMaskB = fFontConf.PeekByte(3)

For Local i:Int = 4 Until fFontConf.Length() Step 13  'ab hier fehler
         Local CharAsci = fFontConf.PeekByte(i)
         Local CharPosX = fFontConf.PeekInt(i + 1)
         Local CharPosY = fFontConf.PeekInt(i + 5)
         Local CharWidth = fFontConf.PeekInt(i + 9)
next


Hier mal eine Debug ausgabe: Korrekt unter HTML 5
Code: [AUSKLAPPEN]

height69
charMaskR0
charMaskG0
charmaskB0

asci32
CharPosX: 1
CharPosY: 0
CharSize:  12

asci65
CharPosX: 14
CharPosY: 0
CharSize:  31



und hier falsh unter flash Laughing
Code: [AUSKLAPPEN]

height69
charMaskR0
charMaskG0
charmaskB0
asci32
CharPosX: 16777216
CharPosY: 0
CharSize:  201326592

asci65
CharPosX: 234881024
CharPosY: 0
CharSize:  520093696


So wie mir das aussieht springe ich Byte-Technisch zu weit in der Datei und lese müll aus.
Ideen welche schritte ich wirklich nehmen muss?


Vielen Dank!

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

DAK

BeitragFr, Jul 31, 2015 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Schaut nach einem Byte Order-Problem aus. Scheint, als würde in Flash die Byte-Reihenfolge verkehrt sein.

Um es zu testen, lass mal diesen Wert auslesen: 16909060

Ich nehme an, in Flash kommt dann 67305985 raus.

Was noch alternativ sein kann ist, dass du um 3 Bytes zu weit rechts liest. In dem Fall musst du um drei Bytes weiter links lesen.

Die dritte Möglichkeit wäre, dass PeekInt unter Flash nur an vollen Int-Grenzen lesen kann, also die Position nur Werte Modulo 4 annehmen kann. Dafür würde sprechen, dass das Problem nur bei ReadInts auftritt. Ein ähnliches Problem könnte sein, dass PeekInt nicht den Byte-Offset sondern den Int-Offset nimmt. In diesen beiden Fällen musst du dir ReadInt mittels ReadByte nachbasteln. Dazu einfach alle vier Werte mit ReadByte auslesen, und hochmultiplizieren.
Gewinner der 6. und der 68. BlitzCodeCompo

Dottakopf

BeitragMo, Aug 03, 2015 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Dak,

tätsächlich kommt beim lesen eines Ints der Wert 67305985 raus.

Byte Order Problem.. hm was muss ich nun tun ? Embarassed

Scheinbar muss ich um einen anderen Offset springen.
In meinem Testprogramm mache ich folgendes

Code: [AUSKLAPPEN]

Byte1
Byte2
Byte3

Int1 
Int2


In der File steht:
Code: [AUSKLAPPEN]

1
2
3
16909060
256



Mein kläglicher Versuch es auszulesen:
Code: [AUSKLAPPEN]

   DataFile = DataBuffer.Load("monkey://data/file.txt")
      If DataFile = Null Then Error "File not found: "
      
         TmpWert = DataFile.PeekByte(0)
            Print "Byte1: " + TmpWert    'Ausgabe = 1
         TmpWert = DataFile.PeekByte(1)
            Print "Byte2: " + TmpWert    'Ausgabe = 2 
         TmpWert = DataFile.PeekByte(2)
            Print "Byte3: " + TmpWert    'Ausgabe = 3
            
         TmpWert = DataFile.PeekInt(0)
            Print "Int1: " + TmpWert    'Ausgabe = 16909060 (Richtig)
         
         TmpWert = DataFile.PeekInt(3)
            Print "Int2: " + TmpWert    'Ausgabe = 67305985  (Falsch, müsste 256 sein)

      DataFile.Discard()




Den ersten Int bekomme ich mit dem Offset= 0 noch korrekt ausgelesen.. aber der zweite Int bringt mist.


hoch multiplizieren .. mit welchen potenzschritten? Embarassed

Vielen Dank für deine Hilfe !!

Gruß
Dottakopf

BladeRunner

Moderator

BeitragDi, Aug 04, 2015 6:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Reihenfolge in deinem File
Byte,Byte,Byte,Int,Int ist, müsstest Du dann die Werte nicht so auslesen:
peekbyte(0),peekbyte(1),peekbyte(2),Peekint(3),Peekint(7)
denn so wie Du es bislang machst peekst Du ja die schon gelesenen Bytes im ersten peekint mit ein,
was dann 1,2, 3, 4 einliest für die einzelnen bytes.
Der zweite Peekint startet ab dem 4. Byte und liesst dann ein: 4,3,2,1, was dann der 169blabla entspricht.

Ich kenne mich mit Monkey nicht aus, aber wenn es Targetabhängig ist solltest Du anhand eines Targetschalters die eingelesenen Ints byteweise in der Reihenfolge verdrehen (big Endian <-> little Endian.


EDIT: Es scheint in der Tat so als sei Flash big endian, alle anderen Targets little endian, siehe hier:
http://www.monkey-x.com/Commun...topic=8731
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Dottakopf

BeitragDi, Aug 04, 2015 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,


Toll ! Vielen Dank für eure Mühe.
Ich habe nun die Bytes einzeln gelesen und nach little Endian zusammengebastelt.

das ergibt folgenden Funktionstüchtigen code:
Code: [AUSKLAPPEN]


TmpWert = DataFile.PeekByte(0)  'Byte 1 auslesen
TmpWert = DataFile.PeekByte(1)  'Byte 2 auslesen
TmpWert = DataFile.PeekByte(2)  'Byte 3 auslesen 

Local b3:Int = DataFile.PeekByte(3)  'hier kommt der int / unterteilt in 4 Bytes
Local b4:Int = DataFile.PeekByte(4)
Local b5:Int = DataFile.PeekByte(5)
Local b6:Int = DataFile.PeekByte(6)
         
TmpWert = (b6 shl 24) | (b5 shl 16) | (b4 shl 8) | b3  'nach little Endian zusammenbauen
If TmpWert < 0 Then TmpWert = 256 + TmpWert       'Auf unsignd prüfen !

Print "Int1: " + TmpWert  'der ausgelesene Int :)




Der Fileinhalt zum obigen würde so aussehen(Für die Suchenden)
Code: [AUSKLAPPEN]

Byte
Byte
Byte
Int


Solange keine Negativen Werte in der File stehen funtzt das toll. ( Ist ja klar ich prüfe auf unsigned )


Fällt jemanden noch ein Verbesserungsvorschlag ein ?
Ich denke das ich heute sehr später Abend das ganze in mein Projekt mit übernehme und mal gucke obs da auch noch so gut funktioniert.

Vielen Dank für eure Hilfe !!!

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group