Seite 1 von 2

FileWrite Signed/Unsigned

Verfasst: 07.07.2013 19:47
von Lambda
Abend PBBFF´s,

habe das zur Rekonstruktion des 3do Formats benötigt.

Code: Alles auswählen

Procedure FileWriteUnsigned(File, Value.d, Bytes)
  Define b.d, x.d = Int(Abs(Value))
  For i=0 To Bytes-1
    b = Int(x/Pow(256, Bytes-i-1))
    x - b*Pow(256, Bytes-i-1)
    WriteByte(File, b)
  Next
EndProcedure


Procedure FileWriteSigned(File, Value.d, Bytes)
  Define b.d, x.d = Int(Abs(Value))
  
  
  WriteByte(File, Bool(Value<0))
  For i=0 To Bytes-2
    b = Int(x/Pow(256, (Bytes-1)-i-1))
    x - b*Pow(256, (Bytes-1)-i-1)
    WriteByte(File, b)
  Next
EndProcedure

Re: FileWrite Signed/Unsigned

Verfasst: 07.07.2013 20:51
von NicTheQuick
Das kommt mir etwas merkwürdig vor, was du da machst. Was soll das genau tun?

Re: FileWrite Signed/Unsigned

Verfasst: 08.07.2013 06:49
von 7x7
NicTheQuick hat geschrieben:Was soll das genau tun?
(siehe meine Signatur /:-> )

Re: FileWrite Signed/Unsigned

Verfasst: 26.07.2013 21:41
von Lambda
7x7 hat geschrieben:
NicTheQuick hat geschrieben:Was soll das genau tun?
(siehe meine Signatur /:-> )
Wenn du die paar Zeilen nicht verstehst, bist du hier falsch.

Re: FileWrite Signed/Unsigned

Verfasst: 26.07.2013 23:52
von NicTheQuick
Naja, ich hab wirklich gefragt, weil ich nicht genau verstanden haben, was das machen soll und auch keine Lust hatte den Code auseinanderzufriemeln. Das merkwürdigste daran ist aber, dass hier Fließkommazahlen als Parameter rein kommen und dann scheinbar irgendwie in Ganzzahlen umgerechnet und byteweise in eine Datei geschrieben werden. Das kam mir nicht ganz sauber vor.

Also was macht das jetzt genau? Ich hab's immer noch nicht ganz kapiert.

Re: FileWrite Signed/Unsigned

Verfasst: 27.07.2013 00:02
von c4s
...sieht vor allem unnötig kompliziert und ineffizient aus.

Re: FileWrite Signed/Unsigned

Verfasst: 27.07.2013 01:52
von STARGÅTE
Ich verstehe den Code leider auch nicht.

Du übergibst eine Double, wendest dann aber Int() darauf an und speicher es wieder in einer Double?
Nun kannst du ja auch 123.456789e20 übergeben, dann gibt Int() aber irgend ein Müll aus.

Des weiteren fehlen ja die Funktionen FileReadUnsigned und FileReadSigned.

Re: FileWrite Signed/Unsigned

Verfasst: 27.07.2013 11:39
von NicTheQuick
Okay, hab's jetzt doch mal durchgekaut und meine Vermutung hat sich bestätigt. Im Grunde wandelt er die Fließkommazahl in eine Ganzzahl um und schreibt sie als BigEndian raus. Die Signed-Version schreibt außerdem noch ein zusätzliches Byte davor, was dann angibt, ob die Zahl negativ ist.

Meine Version wäre dann diese hier:

Code: Alles auswählen

; Author: Alex W. (alias Alexi)
;         Nicolas G. (alias NicTheQuick)
; http://www.mevedia.de

Procedure.i FileWriteUnsigned(FileID.i, Value.d, Bytes.i)
	If (Bytes > 8)					;Wenn mehr als 8 Bytes benutzt werden wollen, brich ab.
		ProcedureReturn #False
	EndIf
	
	Protected q.q = Abs(Value)		;Wandle Double in Quad um
	Protected i.i = Bytes - 1
	
	If (Pow(256., Bytes) < Value)	;Wenn die Zahl nicht durch die gewünschte Anzahl Bytes darstellbar ist, brich ab.
		ProcedureReturn #False
	EndIf
	
	While (i >= 0)					;Schreibe die Bytes des Quads rückwarts raus. (Big Endian)
		WriteByte(FileID, @q + i)
		;Debug PeekA(@q + i)
		i - 1
	Wend
	ProcedureReturn #True
EndProcedure

Procedure.i FileWriteSigned(FileID.i, Value.d, Bytes.i)
	If (Bytes > 8)						;Wenn mehr als 8 Bytes benutzt werden wollen, brich ab.
		ProcedureReturn #False
	EndIf
	
	Protected q.q = Abs(Value)			;Wandle Double in Quad um.
	Protected i.i = Bytes - 2
	
	If (Pow(256., Bytes - 1) < Value)	;Wenn die Zahl nicht durch die gewünschte Anzahl Bytes darstellbar ist, brich ab.
		ProcedureReturn #False
	EndIf
	
	WriteByte(File, Bool(Value < 0))	;Schreibe Vorzeichen von Value raus.
	
	While (i >= 0)						;Schreibe die Bytes des Quads rückwarts raus. (Big Endian)
		WriteByte(FileID, @q + i)
		;Debug PeekA(@q + i)
		i - 1
	Wend
	ProcedureReturn #True
EndProcedure

Debug FileWriteUnsigned(0, 40000000000., 5)
Debug "---"
Debug   FileWriteSigned(0, -40000000000., 6)
Ich habe sie allerdings limitiert auf 8 Bytes maximal, weil das am einfachsten war.

Re: FileWrite Signed/Unsigned

Verfasst: 27.07.2013 11:45
von 7x7
@Alexi:
Wenn du witzigerweise nach 3 Wochen diesen alten Thread rauskramst und den Beleidigten spielst, hättest du auch für den Einzigen, der wissen wollte, was dein Code Wie und Warum macht, eine Erklärung abgeben können. Aber vielleicht hast du es inzwischen selbst schon vergessen .

@NicTheQuick:
Ist dir langweilig? :mrgreen:

Re: FileWrite Signed/Unsigned

Verfasst: 27.07.2013 11:47
von CSHW89
Ich würde aber noch "Pow(256., Bytes)" zu "1 << (8*Byte)" ändern. Oder besser noch den Vergleich ersetzen durch "(Value >> (8*Byte)) < 0"

lg Kevin

PS: @7x7 :mrgreen: , ja mir auch