FileWrite Signed/Unsigned

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

FileWrite Signed/Unsigned

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FileWrite Signed/Unsigned

Beitrag von NicTheQuick »

Das kommt mir etwas merkwürdig vor, was du da machst. Was soll das genau tun?
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: FileWrite Signed/Unsigned

Beitrag von 7x7 »

NicTheQuick hat geschrieben:Was soll das genau tun?
(siehe meine Signatur /:-> )
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: FileWrite Signed/Unsigned

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FileWrite Signed/Unsigned

Beitrag 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.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: FileWrite Signed/Unsigned

Beitrag von c4s »

...sieht vor allem unnötig kompliziert und ineffizient aus.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: FileWrite Signed/Unsigned

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FileWrite Signed/Unsigned

Beitrag 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.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: FileWrite Signed/Unsigned

Beitrag 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:
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: FileWrite Signed/Unsigned

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten