[Monkey] ints werden falsch aus .txt gelesen
Übersicht Andere Programmiersprachen Allgemein
DottakopfBetreff: ints werden falsch aus .txt gelesen |
Fr, Jul 31, 2015 15:26 Antworten mit Zitat |
|
---|---|---|
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 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 |
Fr, Jul 31, 2015 19:26 Antworten mit Zitat |
|
---|---|---|
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 |
Mo, Aug 03, 2015 19:12 Antworten mit Zitat |
|
---|---|---|
Hallo Dak,
tätsächlich kommt beim lesen eines Ints der Wert 67305985 raus. Byte Order Problem.. hm was muss ich nun tun ? 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? Vielen Dank für deine Hilfe !! Gruß Dottakopf |
||
BladeRunnerModerator |
Di, Aug 04, 2015 6:12 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Aug 04, 2015 17:45 Antworten mit Zitat |
|
---|---|---|
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! |
Übersicht Andere Programmiersprachen Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group