[Monkey] Simple Text auslesen

Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Dottakopf

Betreff: Simple Text auslesen

BeitragDo, März 27, 2014 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Morgen Blitzer..


bitte entschuldigt wenn ich mich etwas dumm anstelle.
aber wie zum hencker liest man eine total simple text datei aus.

Gerade im US Forum sehe ich jede menge beispiele die aber total aufgeblasen sind.


Es kann doch nicht so schwer sein ein text file zu öffnen und einige zeilen auszulesen Shocked
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

PhillipK

BeitragDo, März 27, 2014 13:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Da gibts viele ansätze.
In meinen ersten versuchen hatte ich erstmal alte libs von mir portiert und entsprechend angepasst. Allen vorweg: Ini reader.

Code: [AUSKLAPPEN]
   'summary: Creates a Ini with a given txt file.
   Method New(file:String)
      file = file.Replace(".ini", ".txt")
      
      Local fileContent:String = LoadString(file)
      LoadIni(fileContent)
   End


Code: [AUSKLAPPEN]

   'summary: Loads the data that is contained in a string.
   Method LoadIni:Ini(fileContent:String)
            [...]
      If fileContent.Length() > 0 Then
         Local data:String[] = fileContent.Split("~n")
                                [...]


wie du eventuel siehst, verwende ich etwas sehr einfaches:
LoadString(file)

Der typ der datei wird meineswissens hierdurch festgelegt:
Code: [AUSKLAPPEN]
#TEXT_FILES="*.txt|*.xml|*.json"

Das ist ein auszug aus targets\android\template\CONFIG.MONKEY.

Getestet hab ich das allerdings nie, ich vermute es nur.

LoadString gibt dir den kompletten inhalt der txt, xml oder json datei als string.
Diesen kannst du dann in zeilen aufteilen:
Code: [AUSKLAPPEN]
Local data:String[] = fileContent.Split("~n")

~n ist ein terminierter string welches für Ascii 13 steht glaube ich ^^ (entweder 13, oder 10, oder 10 13 ooooder 13 10.. Wie auch immer, einfach zeilenumbruch wie er durch "enter" im editor erzeugt wird)

Das würde dies beantworten:
Zitat:
Es kann doch nicht so schwer sein ein text file zu öffnen und einige zeilen auszulesen Shocked


Wenn es spezieller wird, musst du dir eventuell noch einen wrapper drumrum bauen, wie ich es zb mit meiner ini getan habe, aber in den grundzügen ist dies der einfachste weg den ich kenne, eine textdatei auszulesen und zeilen auszulesen.

eine andere methode geht über streams, wovon es mir persönlich aber zuviele formen gibt (manche erfordern auch abstrakte pfadangaben im stil monkey:\\data\ wenn ich mich recht erinner.)

Midimaster

BeitragDo, März 27, 2014 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
ich schreibs mal ein wenig 'einfacher':

Code: [AUSKLAPPEN]
Local Text$=LoadString("beispiel.txt")
print Text



Wenn Du an die einzelnen Zeilen rankommen willst:

Code: [AUSKLAPPEN]
Local Text$=LoadString("beispiel.txt")
Local Lines$[]= Text.Split("~n")
For Local Line$ =Eachin Lines
   Print "ZEILE=" + Line
Next
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Dottakopf

BeitragFr, März 28, 2014 9:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Morgen Blitzer,

danke für die ersten Hilfestellungen.

ich dachte ich muss dafür das Modul
Code: [AUSKLAPPEN]
brl.filestream
und evt. Code: [AUSKLAPPEN]
brl.filesystem
verwenden.

Laut doku hätte ich dann auch die Möglichkeit Readbye, Readint.. etc zu verwenden.
Nur ich habe nicht verstanden wie die Syntax funktionieren soll um eine Datei zu öffnen. In der Doku stehen nur die einzelen Befehle ohne zusammenhang...

Wenn es natürlich andere/simplere Lösungen gibt nutze ich diese auch gerne ! Möglichst von allen Targets sollten sie unterstützt werden.

wenn ich mir das zum Beispiel ansehe:

Code: [AUSKLAPPEN]
Local Text$=LoadString("beispiel.txt")
Local Lines$[]= Text.Split("~n")
For Local Line$ =Eachin Lines
   Print "ZEILE=" + Line
Next


Wie könnte man es abwandeln um Byte für Byte einzulesen. (Ohne das ich die ausgelsene Zeile zerhacken muss und mir die Bytes selber rauspicke)

zudem ist hier alles als String deklariert. Was ist wenn nur Zahlen in der Datei sind?
Rechtschreibfehler gelten der allgemeinen Belustigung!

Midimaster

BeitragFr, März 28, 2014 10:51
Antworten mit Zitat
Benutzer-Profile anzeigen
also wenn es sich um einen String handelt, dann ist LoadString die performancemäßig schnellste Möglichkeit. Aus dem String die einzelnen Bytes rauszuhacken ist anschließend gar nicht so doof, weil auch sehr schnell...

Oder suchst Du nach einer Möglichkeit in der Datei mit FileSeek gezielt bestimmte Positionen anzupeilen? Das wird auf manchen Targets sehr langsam werden.

Du sagst jetzt, das es sich um "Zahlen" handelt. Fortlaufende Zahlen? Oder in Zeilen unterteilt? Mit TABs dazwischen? Sind die Zahlen als "Buchstaben" oder als Bytes in der Datei? Beispiel: Die Zahlen 1,2,3 als Buchstaben wären die Bytes 49|50|51 in der Datei und mit einem Text-Editor als 123 sichtbar. Sind die Zahlen 1,2,3 aber als Bytes gespeichert, wären die Bytes 01|02|03 in der Datei und mit einem TextEditor als seltsame Zeichenfolge nicht lesbar.


Ich glaube, Du musst uns mehr über den Inhalt der Datei sagen, damit wir wissen, wie eine optimale Lösung aussehen könnte. Auch wäre es wichtig, was Du mit den Bytes vorhast... Und ob Sie auch wieder zurückgespeichert werden sollen....
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Dottakopf

BeitragFr, März 28, 2014 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun erstmal wollte ich mit den basic anfangen Smile

Inhalt einer Datei
Code: [AUSKLAPPEN]

a
b
c
1
2
3


Die Datei die ich dann später auslesen möchte müsste so aufgebaut sein(Alles Bytes)
byte,byte,byte,byte,byte

Letztendlich wird es auf so einen Code rauslaufen: Pseudo Code
Code: [AUSKLAPPEN]

until Eof(File)
byte = readbyte(file)
next




genauer ich möchte die .fnt Dateien des Fontmakers hier aus dem Showcase auslesen.

Zitat:

wären die Bytes 01|02|03 in der Datei und mit einem TextEditor als seltsame Zeichenfolge nicht lesbar.


genau das ist der fall Smile
Rechtschreibfehler gelten der allgemeinen Belustigung!

Jolinah

BeitragFr, März 28, 2014 12:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Das kommt auf die Zielplattform an. Laut Dokumentation kann bei Html5 und Flash kein FileStream.Open verwendet werden (weil man halt von HTML nicht direkt Dateien öffnen kann, aber man kann via AJAX Dateien als String laden, weswegen LoadString funktioniert).

FileStream funktioniert aber bei Android, iOS, Windows 8, Desktop (Glfw), Xna, Psm. Da laut Dokumentation aber auch nur wenn man Pfade im Stil von "monkey://internal/<pfad>" verwendet. Monkey wandelt diese Pfade dann je nach Zielplattform um.

Wenn du das berücksichtigst, dann funktioniert das Modul brl.filestream wie vorgesehen Wink

Code: [AUSKLAPPEN]
Import brl.filestream

...

Local stream:FileStream = FileStream.Open("monkey://internal/myfile.txt", "r")
While Not stream.Eof()
   Local wert:Int = stream.ReadByte()
Wend
stream.Close()


Wenn die Lösung auf jeder Plattform funktionieren soll, müsstest du eher die Klasse DataBuffer verwenden, zusammen mit "monkey://data/<pfad>":

Code: [AUSKLAPPEN]
Import brl.databuffer

...

Local buf:DataBuffer = DataBuffer.Load("monkey://data/myfile.txt")
For Local i:Int = 0 To buf.Length - 1
   Local wert:Int = buf.PeekByte(i)
Next
buf.Discard()
  • Zuletzt bearbeitet von Jolinah am Fr, März 28, 2014 12:11, insgesamt einmal bearbeitet

Dottakopf

BeitragFr, März 28, 2014 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
~edit~
Rechtschreibfehler gelten der allgemeinen Belustigung!

Dottakopf

BeitragFr, März 28, 2014 13:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ne ich tu mich noch etwas schwer Embarassed


also in der Datei sind bytes..
byte,byte,byte

wie lese ich den ersten oder überhaupt einen Byte mit loadstring aus? (und ich spiele nicht auf die mid befehle an ) Very Happy

vll noch etwas zerhacken:
Code: [AUSKLAPPEN]

Local Text:String = LoadString("numbers.fnt")

öffnet die Datei und speichert den inhalt in Text ?

Code: [AUSKLAPPEN]

Local Lines:String[] = Text.Split("~n")


speichert die einzelen werte in ein Arry (Parameter ~n sagt mir nichts)

jetzt hätte ich den byte inhalt ausgelsen aber nur als string.. nun müsste ich noch auf Bytes umwandeln
sofern das geht
Rechtschreibfehler gelten der allgemeinen Belustigung!

BladeRunner

Moderator

BeitragFr, März 28, 2014 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
~n sucht nach einem Zeilenumbruch und split wandelt somit deinen String in ein array aus Strings welches aus den einzelnen Zeilen in deinem Textfile besteht.

Damit ist .split ungeeignet für deinen Einsatzzweck.
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

Midimaster

BeitragFr, März 28, 2014 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Du liest den gesamten Text mit LoadString() ein. Das Splitten kannst du Dir sparen.

Anschließend kannst Du direkt auf die Bytes zugreifen.

Code: [AUSKLAPPEN]
Wert%=Text[0]

...liefert dir das Byte des ersten Zeichens gleich als INTEGER.

Wahrscheinlich gelingt auch das (nicht getestet):
Code: [AUSKLAPPEN]
For Local i%=0 to Text.Length()
    Wert%[i]=Text[i]
Next
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

PhillipK

BeitragFr, März 28, 2014 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt bin ich mal toll und zitiere mich selbst:
Zitat:

~n ist ein terminierter string welches für Ascii 13 steht glaube ich ^^ (entweder 13, oder 10, oder 10 13 ooooder 13 10.. Wie auch immer, einfach zeilenumbruch wie er durch "enter" im editor erzeugt wird)


Aber wie bereits erwähnt, ist dies für deine Zwecke nutzlos.

Es gibt einen großen unterschied zwischen Streams und LoadString:
Streams lesen direkt von dem Speichermedium aus, LoadString lädt, wie der name schon vermuten lässt, den GESAMTEN INHALT der datei. Dieser landet also 1zu1 als String-class im Ram deines Targets.
Hier ist es also anzuraten, möglichst kleine dateien zu laden. Solltest du eine art rar paket laden wollen (als beispiel), da dieses deine gesamten daten wie bilder, sounds etc enthält, dann brauchst du defintiiv streams. Stell dir vor, dein Programm lädt eine 500mb Ressourcen datei in den Ram - das dauert schonmal seine zeit und ist auchnoch pure verschwendung.


Ich hab dir hier mal einen pseudocode geschrieben. Müsste soweit funktionieren:

BlitzMax: [AUSKLAPPEN]
Class ErsatzStream

'intern genutzt
Field _position:Int = 0
Field data:String

'Constructor. Nimmt einen file-path als parameter.
Method New(file:String)
'Datei laden
Self.data = LoadString(file)

'Fehlercheck: Kam nix an, error schmeißen.
If Self.data.Length() <= 0 Then Error("File: " + file + " konnte nicht korrekt geladen werden.")
End

'ReadByte - einen einzelnen Byte auslesen und zurückgeben.
Method ReadByte:Int(pos:Int)
'Fehlercheck: Wenn weniger daten vorhanden als die geforderte position erwartet, dann -1 zurückgeben.
If Self.data.Length() <= pos Then Return - 1

'Die position im "Stream" aka String zurückgeben.
Return Self.data[pos]
End Method
Method ReadByte:Int()
'temporär den byte speichern. Die "_pos" variable diehnt zum stream-faken.
Local tmp:Int = Self.ReadByte(_position)

'interne position um eins erhöhen.
Self._position += 1

Return tmp
End

'ReadShort - Zwei Bytes auslesen und zusammenfügen, danach zurückgeben.
' Anmkerung: Ein Short besteht aus 2 Bytes. Da ein Byte insg. 8 bit hat, sieht der short so aus:
' Bits: XX XX XX XX YY YY YY YY
' Hex : XX YY
' Hinweis: X Spiegelt den ersten byte, Y den zweiten byte wieder.
Method ReadShort:Int(pos:Int)
'Fehlercheck: Wenn weniger daten vorhanden als die geforderte position erwartet, dann -1 zurückgeben.
If Self.data.Length() <= pos + 1 Then Return - 1

'ACHTUNG: Hier werden _ZWEI_ bytes ausgelesen. Es muss also pos und pos+1 ausgelesen werden (die geforderte position sowie der byte danach.)
Local byte1:Int = Self.data[pos + 0]
Local byte2:Int = Self.data[pos + 1]

Return (byte1 Shl 8) | (byte2)

'Weitere anmerkung:
' shl X verschiebt die zahl um X bits nach links. Bedeutet, das der erste Byte im interger auf die position vom 2ten byte verschoben wird. Anders gesagt:
' aus : 00 00 00 00 11 11 11 11
' wird: 11 11 11 11 00 00 00 00
' Des weiteren werden mit "|" beide "bytes" verknüpft.
End
Method ReadShort:Int()
Local tmp:Int = Self.ReadShort(_position)

Self._position += 2

Return tmp
End

'ReadInt - Vier Bytes auslesen und zusammenfügen, dann zurückgeben.
'Anmerkungen: Siehe Readshort. Weitere Bytes werden links angefügt.
Method ReadInt:Int(pos:Int)
'Fehlercheck: Wenn weniger daten .. blabla ^^
If Self.data.Length() <= pos + 3 Then Return - 1

Local byte1:Int = Self.data[pos + 0]
Local byte2:Int = Self.data[pos + 1]
Local byte3:Int = Self.data[pos + 2]
Local byte4:Int = Self.data[pos + 3]


Return (byte1 Shl 24) | (byte2 Shl 16) | (byte3 Shl 8) | (byte4)
End
Method ReadInt:Int()
Local tmp:Int = Self.ReadInt(_position)

Self._position += 4

Return tmp
End

End


Wichtig sind hier die Methoden "ReadByte" "ReadShort" und "ReadInt", welche den parameter "pos" enthalten.
Die anderen habe ich überladen, um die arbeitsweise eines streams zu faken.
Aber auch aus den fakes kannst du was wichtiges lesen: Die abstände der einzelnen werte Smile

Hier nochmal eine kleine zusammenfassung:

- Jeder "Index" im String ist ein einzelnes Byte.
- Diese Bytes kannst du über ihre position auslesen. Der index muss zwischen 0 und String.Length() -1 liegen.
- Für jeden byte das du auslesen möchtest, erhöhe die leseposition um 1
- Für jeden short das du auslesen möchtest, lese insg. 2 bytes aus und verbinde sie, anschließend erhöhe die leseposition ebenfalls um 2.
- Für jeden int das du auslesen möchtest, lese insg. 4 bytes aus und verbinde sie, anschließend erhöhe die leseposition ebenfalls um 4.

Zum verbinden der bytes habe ich dir ebenfalls ein beispiel eingefügt. Allerdings bin ich mir nicht ganz sicher, in welcher reihenfolge die bytes geschrieben werden, das musst du testen. Soweit mir bekannt, ist das ganze auch von der art der speicherung abhängig - Little Endian VS Big Endian.

Dh ein integer kann wie folgt gespeichert sein:
Byte1, Byte2, Byte3, Byte4

oooder eben
Byte4, Byte3, Byte2, Byte1.

Jolinah

BeitragFr, März 28, 2014 16:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder wie erwähnt einfach die Klasse DataBuffer verwenden (hast du meinen Post überhaupt gesehen?) Wink

DataBuffer scheint für binäre Daten ausgelegt zu sein, und funktioniert auf jeder Zielplattform, so lange man Pfade wie "monkey://data/<pfad>" verwendet.

Wobei die Anmerkung von PhillipK natürlich stimmt. Selbst bei DataBuffer wird vermutlich der komplette Datei-Inhalt in den Buffer bzw. ins Ram geladen.

Dottakopf

BeitragFr, März 28, 2014 17:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo !

wow danke für die ausführlichen Hilfestellungen !!

aber scheinbar mache ich noch etwas ganz grundliegendes falsch.
Ich habe in bb eine textfile erstellen lassen die 2 bytes in die Datei schreibt.

in Monkey Oncreate dieser Code zeigt nichts an..

Code: [AUSKLAPPEN]

Text = LoadString("test.txt")
Print "wert:" +Text   


das ist auf das minimalste reduziert, egal welcher typ.. es müsste zumindest irgendwas angezeigt werden.
Tut es aber nicht..


ich komm mir echt total beschränkt vor Embarassed
Rechtschreibfehler gelten der allgemeinen Belustigung!

Midimaster

BeitragFr, März 28, 2014 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
hast du daran gedacht, einen Ordner "MyApp.data" neben "MyApp.monkey" anzulegen und die Datei in diesen Ordner zu verschieben?

Sende mal den gesamten Code deines Testprogramms. Lade mal die Datei über das Archiv hier hoch.

Auf welchem Target arbeitest Du?

Füge mal zwei weitere Printzeilen ein:
Code: [AUSKLAPPEN]
Print "Wert-Byte:" + Text[0]
Print "String-Länge:" + Text.Length()


Das kriegen wir schon hin...
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

Dottakopf

BeitragFr, März 28, 2014 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
oh man.. der Data oder war da.. aber im bezug zur main file falsch benannt.
nun klappts natürlich. Embarassed

und mit
Code: [AUSKLAPPEN]

For Local i%=0 to Text.Length()


wird das auch mit den Bytes auslesen kappen.
Vielen Vielen Dank.

War ja wirklich eine sehr schwere geburt Sad
Rechtschreibfehler gelten der allgemeinen Belustigung!
 

PhillipK

BeitragFr, März 28, 2014 19:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Aufpassen:

Zitat:
For Local i%=0 to Text.Length()


Text.Length() gibt dir die länge des Textes.
"Das ist ein String." hat 19 Zeichen wenn ich grade richtig gezählt habe.
"D" hat 1 Zeichen.

Das sind die werte, die dir .Length zurückgibt.

Beim "auslesen" brauchst du die array-indices, beginnend bei 0. bei oberem string ist also [0] = "D", [18] = "."

Greifst du auf das 19te element zu gibts nen fehler Razz
Ergo: Verwende "Until" anstatt "To"

Farbfinsternis

BeitragFr, März 28, 2014 20:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

For Local i:Int = 0 Until text.Length() ...

Dottakopf

BeitragMi, Apr 02, 2014 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey jetzt bin ichs nochmal.

Die Idee mit den FakeStream gefällt mir. Also hab ich es nachgebaut.
Bytes klappen noch ohne Probleme, aber wenn ich einen einzelen int auslesen will funtzt das überhaupt nicht.

ich Blitz Basic 3D schreibe ich einen einzelen Int wert in eine txt datei
Code: [AUSKLAPPEN]

fileout = WriteFile("numbers.txt")
   WriteInt(fileout,1234)
CloseFile(fileout)



Kurz gefasst versuche ich nun die 4 Bytes des ints auszulesen. Aber schon hier liest er nicht wirklich das ein was gewünscht ist:

Code: [AUSKLAPPEN]

......

           Local byte1:Int = Self.fFakeData[pStreamPos + 0]
      Local byte2:Int = Self.fFakeData[pStreamPos + 1]
      Local byte3:Int = Self.fFakeData[pStreamPos + 2]
      Local byte4:Int = Self.fFakeData[pStreamPos + 3]

                Return (byte4 Shl 24) | (byte1 Shl 16) | (byte2 Shl 8) | (byte3)
.....



Byte1 trägt den Wert: 65533
Byte2 trägt den Wert: 4
Byte3 trägt den Wert: 0
Byte4 trägt den Wert: 0

Zusammengebaut wird daraus: -195584


richtig wäre
Byte1: 1
Byte2: 2
Byte3: 3
....



Allgemein das zusammenbauen funtzt überhaupt nicht so wie es sollte. Statt die Werte zusammenfügen macht er eine "Art" Addition. Ich sage eine Art weil ich nicht nachvollziehen kann was er da genau treibt.

Beispiel: (pseudo)
Code: [AUSKLAPPEN]

a:int = 1
b:int = 5

return ( a | b )


gibt 6 aus...

füge ich noch eine Zeile hinzu .. gibt er weiterhin 6 aus Confused

Aber ich wäre ja schonmal froh wenn ich es schaffen würde die richtigen bytes aus dem einzelen int herauszulesen
Rechtschreibfehler gelten der allgemeinen Belustigung!

DAK

BeitragMi, Apr 02, 2014 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Also mal das Erste: | ist nicht eine Art Addition sondern ein binäres Oder, das heißt, in binärer Repräsentation der Zahlen wird jedes Bit von den Eingangswerten einzeln angeschaut, und wenn zumindest eines der Bits der beiden Zahlen 1 ist, dann ist das Ergebnis auch eins:

Code: [AUSKLAPPEN]

"ODER" in Binär:
0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1

12 (dezimal) = 00001100 (binär, 8 Bit, also 1 Byte)
 6 (dezimal) = 00000110 (binär, 8 Bit)

12       00001100
 |    =
 6       00000110
=
14       00001110


Ganz ähnlich rennt auch &, was das binäre Und ist, das ist dann 1 wenn beide Eingaben 1 sind:

Code: [AUSKLAPPEN]

"UND" in Binär:
0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1

12 (dezimal) = 00001100 (binär, 8 Bit, also 1 Byte)
 6 (dezimal) = 00000110 (binär, 8 Bit)

12       00001100
 &    =
 6       00000110
=
 4       00000100


Dann zum eigentlichen Problem, bzw. dem was das Ding tut.

Schlüsselzeile zum Zusammenwürfeln:
[code](byte4 Shl 24) | (byte1 Shl 16) | (byte2 Shl 8) | (byte3)[/code
Jedes Byte hat ja 8 Bit. Von den Ints die du da hast (32 Bit) sind (oder sollten) also nur die rechten 8 Bit belegt sein. Jetzt werden die Bytes alle so verschoben (mit Shl, was die Zahl um so viele Bit nach links schiebt, wie angegeben), dass sie nebeneinander passen und mit ODER verknüpft:

[code]
byte1 = 1 (Dec) = 00000000 00000000 00000000 00000001 (Bin)
byte2 = 2 (Dec) = 00000000 00000000 00000000 00000010 (Bin)
byte3 = 3 (Dec) = 00000000 00000000 00000000 00000011 (Bin)
byte4 = 4 (Dec) = 00000000 00000000 00000000 00000100 (Bin)

byte4 Shl 24 = 00000100 00000000 00000000 00000000 (Bin)
byte3 Shl 16 = 00000000 00000011 00000000 00000000 (Bin)
byte2 Shl 8 = 00000000 00000000 00000010 00000000 (Bin)
byte1 = 00000000 00000000 00000000 00000001 (Bin)

Alle mit ODER verknüpft:
00000100 00000011 00000010 00000001 (Bin) = 67305985 (Dec)
[/code]

Was ich bei dir sehe ist, dass die Bytes falsch ausgelesen werden. Bytes können nur einen Bereich von 0-255 annehmen. Dein erstes Byte gibt da aber 65533 aus, wofür man mindestens ein Short bräuchte. Nehme an, dass das was damit zutun hat, dass du in Ints liest. Vielleicht funktioniert es besser, wenn du nach jeder Byte-Deklaration &256 dran schreibst. Das schneidet quasi alle Bits außer den rechtesten 8 weg, so wie es sich für ein Byte gehört.
Was auch möglich wäre ist, dass du ein LittleEndian/BigEndian-Problem hast (siehe Wiki dazu), oder sonst einen Auslesefehler hast. Oder dass deine Datei einfach kaputt ist.
Gewinner der 6. und der 68. BlitzCodeCompo

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht Andere Programmiersprachen Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group