[Monkey] Simple Text auslesen

Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Midimaster

BeitragDo, Apr 03, 2014 1:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt denn das, was DAK und Dottakopf da schreiben?

Wenn ich in Blitz eine INTEGER-Zahl 1234 in eine Datei schreibe, dann liegen doch dort diese 4 Ziffern nicht in je eine in einem der 4 hintereinanderliegen Bytes!?!?!?

Das ganze sieht doch dann eher so aus:
Code: [AUSKLAPPEN]
00000000 00000000 00000100 11010010


oder in Hex so:
Code: [AUSKLAPPEN]
00 00 04 D2


Jetzt werden aber die INTEGER in Blitz scheinbar verkehrt herum in die Bytes der Datei eingetragen, was dann so aussähe:

Code: [AUSKLAPPEN]
D2 04 00 00


das sieht ja dann schon fast so aus, wie Dottakopf es in Monkey öffnet...



Das erste Byte, das er als 65533 in Monkey erhält ist das Unicode Replacement Zeichen "FFFD" für "unbekanntes Charakter". Hier ist dann LoadString scheinbar doch nicht geeignet.

Dottakopf sollte wie Jolinah vorschlägt DataBuffer.Load() verwenden:

Code: [AUSKLAPPEN]
Strict
Import mojo
Import  BRL.DATABUFFER

Class Game Extends App
   Field Buffer:DataBuffer=New DataBuffer(10)

   Method OnCreate%()
      Buffer=DataBuffer.Load("monkey://data/numbers.txt")
      Print "Buffer Length=" + Buffer.Length()
      For Local i%=0 Until Buffer.Length()
         Local value%= Buffer.PeekByte(i)
         Print i+ ".Pos=" + value
      Next
'jetzt richtig:
      Local value%= Buffer.PeekInt(0)
      Print "als INTEGER=" + value
      Error ""
      Return 0
   End   
.....


Die -46, die da jetzt als erstes Byte in Monkey rauskommt sieht Binär so aus:
Code: [AUSKLAPPEN]
11010010
und das entspricht genau unserem letzten Byte der Zahl 1234



Ich muss in Monkey die Bytes nur wieder mit Buffer.PeekInt(0) auslesen und habe das Ergebnis 1234!
  • Zuletzt bearbeitet von Midimaster am Do, Apr 03, 2014 12:33, insgesamt einmal bearbeitet

DAK

BeitragDo, Apr 03, 2014 6:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Jup, das stimmt, was der DAK da sagt. Ein Integer-Wert kann folgende Werte annehmen:

Code: [AUSKLAPPEN]
00000000 00000000 00000000 00000000 (Bin) = 0 (Dec)
00000000 00000000 00000000 00000001 (Bin) = 1 (Dec)
00000000 00000000 00000000 00000010 (Bin) = 2 (Dec)
00000000 00000000 00000000 00000011 (Bin) = 3 (Dec)
...
01111111 11111111 11111111 11111111 (Bin) = 2147483647 (Dec)
10000000 00000000 00000000 00000000 (Bin) = -2147483648 (Dec)
10000000 00000000 00000000 00000001 (Bin) = -2147483647(Dec)
10000000 00000000 00000000 00000010 (Bin) = -2147483646 (Dec)
10000000 00000000 00000000 00000011 (Bin) = -2147483645 (Dec)
...
11111111 11111111 11111111 11111111 (Bin) = -1 (Dec)
und dann wieder
00000000 00000000 00000000 00000000 (Bin) = 0 (Dec)


Dabei werden 32 Bit (oder 4 Bytes) als eine fortlaufende Zahl interpretiert.
Wird das Int in vier einzelne Bytes zerlegt um so gespeichert zu werden, dann wird es entlang der Leerzeichen, die ich eingefügt habe, getrennt. Diese Bytes werden dann einzeln gespeichert.
Will man das Int nach dem Laden wieder zusammenfügen, dann muss man 4 Bytes auslesen, mittels Left-Shifts in Position bringen und dann mittels ODER zusammenfügen.

Dottakopf hat das auch so gesagt, er hat vier einzelne Bytes, mit folgenden Werten:
Dottakopf hat Folgendes geschrieben:
richtig wäre
Byte1: 1
Byte2: 2
Byte3: 3
....


Die will er in ein Int zusammensetzen. Wenn es darum geht, die Werte, die nacheinander in einzelnen Bytes liegen so zusammen zu setzen, dass dann 123 raus kommt, dann müsste man die Bytes auslesen, nach String umwandeln und String-Verknüpfungen machen (str(byte1)+str(byte2)+str(byte3) ...). Ob das Sinn macht, das wage ich aber zu bezweifeln.
Gewinner der 6. und der 68. BlitzCodeCompo

Midimaster

BeitragDo, Apr 03, 2014 12:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich muss in Monkey die Bytes nur wieder mit Buffer.PeekInt(0) auslesen und habe das Ergebnis 1234! Code: [AUSKLAPPEN]
Class Game Extends App
   Field Buffer:DataBuffer=New DataBuffer(10)

   Method OnCreate%()
      Buffer=DataBuffer.Load("monkey://data/numbers.txt")
      Local value%= Buffer.PeekInt(0)
      Print "als INTEGER=" + value
      Error ""
      Return 0
   End   
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Dottakopf

BeitragDo, Apr 03, 2014 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Danke Danke !!!

wirklich vielen dank das ihr mir hier so viele infos gibt. Wäre total aufgeschmissen Crying or Very sad

also Databuffer ist wohl die wahl!
funtzt auch soweit ganz gut.

nur noch eine letzte frage wie ermittle ich am geschicktesten die Größte des Databuffers:
Code: [AUSKLAPPEN]

Buffer = New DataBuffer(10)


mein schnellschuss ansatz war n griff ins klo.
um die Größe zu ermitteln wollte ich mit Loadstring die die Datei bzw. den Inhalt öffnen und als Databuffer die größe des inhalts angeben: (So wie in Doku beschrieben:
Zitat:

Method New ( length:Int )
Creates a new data buffer of the specified byte length.


aktuell kenne ich nur diesen weg die bytegröße eines inhalts auszulesen

Code: [AUSKLAPPEN]

Class MainGame Extends App




   Field Buffer:DataBuffer
   Field file:String

   Method OnCreate:Int()
      SetUpdateRate(GAMEUPDATERATE)
      
         file = LoadString("numbers.txt")
         Buffer = New DataBuffer(file.Length())
   
         Buffer = DataBuffer.Load("monkey://data/numbers.txt")
         Local int1:Int = Buffer.PeekInt(0)
         Local int2:Int = Buffer.PeekInt(1)
         Print "int1:" + int1
         Print "int2:" + int2
         Error ""

   Return (0)
   End



den im Moment kann ich nur den ersten int auslesen. Der zweite int zeigt wieder einen unerwünschten wert an. Ich denke das eine falsche Databuffer länge der Grund dafür ist.
Rechtschreibfehler gelten der allgemeinen Belustigung!

Farbfinsternis

BeitragFr, Apr 04, 2014 7:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Databuffer besitzt das Property "Length()", damit kannst Du die Größe des Buffers in Erfahrung bringen.

Midimaster

BeitragFr, Apr 04, 2014 9:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich vermute mal, dass die Zeile...
Code: [AUSKLAPPEN]
Buffer = New DataBuffer(10)

...gar nicht benötigt wird. Es könnte gut sein, dass bei...
Code: [AUSKLAPPEN]
Buffer = DataBuffer.Load("monkey://data/numbers.txt")

...auch gleich der Buffer in benötigter Größe erzeugt wird. Probiers mal aus!


Wenn Du den 2. INTEGER auslesen willst, musst Du natürlich 4 als Offset dazurechnen , weil er ja ein Integer 4 Bytes lang ist.
Code: [AUSKLAPPEN]
         Local int1:Int = Buffer.PeekInt(0)
         Local int2:Int = Buffer.PeekInt(4)


Also etwa so:

Code: [AUSKLAPPEN]
Class Game Extends App
   Field Buffer:DataBuffer

   Method OnCreate%()
      Buffer=DataBuffer.Load("monkey://data/numbers.txt")
      For Local i%=0 Until Buffer.Length() Step 4
            Local value%= Buffer.PeekInt(i)
            Print "als INTEGER=" + value
      Next
      Error ""
      Return 0
   End   
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Jolinah

BeitragFr, Apr 04, 2014 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau, das New wird nicht benötigt. New wird verwendet um neue Buffer im Ram zu erzeugen, wo man selbst was rein schreiben kann.

Mit Load wird die ganze Datei geladen und der Buffer ist genau so gross wie er sein muss.

Ausserdem sollte man Buffer.Discard() aufrufen wenn man den Buffer nicht mehr benötigt, damit der Speicher im Ram wieder freigegeben wird.

Dottakopf

BeitragFr, Apr 04, 2014 15:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Juhu Very Happy Very Happy Klappt toll.

Habe jetzt gleich auch noch den Bitmap importer fertig geschrieben.

Noch eine Anmerkung:

Code: [AUSKLAPPEN]

Class Game Extends App
   Field Buffer:DataBuffer

   Method OnCreate%()
      Buffer=DataBuffer.Load("monkey://data/numbers.txt")
      For Local i%=0 Until Buffer.Length() Step 4
            Local value%= Buffer.PeekInt(i)
            Print "als INTEGER=" + value
      Next
      Error ""
      Return 0
   End 

 



das Error "" musste in dem code noch raus.

Vielen Vielen Dank!!
Rechtschreibfehler gelten der allgemeinen Belustigung!

Midimaster

BeitragFr, Apr 04, 2014 16:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Error "" diente in diesem Testprogramm dazu, die App sofort nach dem Test zu beenden.
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group