Negativ - Werte einlesen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Negativ - Werte einlesen

Beitrag von Skiller »

Hi Folks,
wie kann ich die Minus-Werte einer 24Bit-Wave Datei auslesen ?
Bei 4 Byte ReadLong(#File) also 'A8 6E F2 00' = -1 469 124 096 ist´s kein Problem
Wie aber kann ich 3 Byte also '0F 42 40' = - 15 777 216 einlesen ?

DANKE !!!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
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: Negativ - Werte einlesen

Beitrag von NicTheQuick »

Na du liest einfach 3 Bytes aus und verknüpfst sie entsprechend:

Code: Alles auswählen

Procedure Read24Bit(FileID.i)
	Protected result.l = ReadAsciiCharacter(FileID)
	result | (ReadAsciiCharacter(FileID) << 8)
	result | (ReadAsciiCharacter(FileID) << 16)
	
	ProcedureReturn result
EndProcedure
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Negativ - Werte einlesen

Beitrag von Skiller »

Hi Nick,
danke für die schnelle Antwort. Werde mich heute damit beschäftigen.
Gruß Skiller
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Negativ - Werte einlesen

Beitrag von Skiller »

Hallo Nick,
hab´s gerade ausprobiert. Leider löst es nicht das Negativ!!! "-" Problem. '0F 42 40' sollte wie gesagt - 15 777 216 und nicht 4211215 ergeben. Gemäß 4 Byte klappt es ja mit der ReadLong(), also 'A8 6E F2 00' = - 1 469 124 096
Val("$FFFFFFFFFF0F4240") = - 15 777 216 gibt zwar das richtige Ergebnis, aber in einer Datei gibt es keine "vor"- 'FFF...s" oder hab ich was übersehen? :shock:
Gruß Skiller
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Negativ - Werte einlesen

Beitrag von Danilo »

Skiller hat geschrieben:'0F 42 40' sollte wie gesagt - 15 777 216 und nicht 4211215 ergeben.
[...]
Val("$FFFFFFFFFF0F4240") = - 15 777 216 gibt zwar das richtige Ergebnis
Woher hast Du denn das -15 777 216?
Wenn Du 3 Nullen liest, nimmst Du dann auch Val("$FFFFFFFFFF000000")?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
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: Negativ - Werte einlesen

Beitrag von NicTheQuick »

Also egal wie ich es versuche. Da kommt kein -15777216 raus. Ich habe das ganze jetzt auch mal in einer Peek-Version gemacht um damit zu testen. 1 und -1 sind korrekt. Und $0F4240 kann gar nicht negativ sein, da das höchste Bit nicht gesetzt ist.

Code: Alles auswählen

Procedure Read24Bit(FileID.i)
	Protected result.l = ReadAsciiCharacter(FileID)
	result | (ReadAsciiCharacter(FileID) << 8)
	result | (ReadAsciiCharacter(FileID) << 16)
	
	If (result > $7fffff)
		ProcedureReturn result - 2 << 23
	EndIf
	ProcedureReturn result
EndProcedure

Procedure Peek24Bit(*Buffer.Ascii)
	Protected result.l = *Buffer\a
	*Buffer + 1
	result | (*Buffer\a << 8)
	*Buffer + 1
	result | (*Buffer\a << 16)
	
	If (result > $7fffff)
		ProcedureReturn result - 2 << 23
	EndIf
	ProcedureReturn result
EndProcedure

Debug Peek24Bit(?Value)
Debug Peek24Bit(?ValueInverse)
Debug Peek24Bit(?Eins)
Debug Peek24Bit(?MinusEins)

DataSection
	Value:
		Data.a $0F, $42, $40
	ValueInverse:
		Data.a $40, $42, $0F
	Eins:
		Data.a $01, $00, $00
	MinusEins:
		Data.a $ff, $ff, $ff
EndDataSection
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Negativ - Werte einlesen

Beitrag von Danilo »

NicTheQuick hat geschrieben:Also egal wie ich es versuche. Da kommt kein -15777216 raus.
Geht mir auch so.

In 24bit passen insgesamt nur 16777216 Werte, 0 bis $FFFFFF.
Vorzeichenbehaftet hat man also 8388608 Stellen für Minus-, und 8388608 Stellen für Plus-Werte
zur Verfügung. Eine Stelle der positiven Zahlen geht für die 0 drauf.
Somit ist der Wertebereich von Vorzeichenbehafteten 24-bit-Zahlen: -8388608 bis 8388607

Code: Alles auswählen

result.l = (($0F<<24)|($42 << 16)|($40 << 8)) ; 0F 42 40
Debug result >> 8
result.l = (($40<<24)|($42 << 16)|($0F << 8)) ; 40 42 0F
Debug result >> 8
result.l = (($00<<24)|($00 << 16)|($00 << 8)) ; 00 00 00
Debug result >> 8
result.l = (($FF<<24)|($FF << 16)|($FF << 8)) ; FF FF FF (-1)
Debug result >> 8
result.l = (($7F<<24)|($FF << 16)|($FF << 8)) ; 7F FF FF
Debug result >> 8
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Negativ - Werte einlesen

Beitrag von Skiller »

Hallo,
guten Morgen und vielen Dank erstmal.
In 24bit passen insgesamt nur 16777216 Werte, 0 bis $FFFFFF. Vorzeichenbehaftet hat man also 8388608 Stellen für Minus-, und 8388608 Stellen für Plus-Werte zur Verfügung. Eine Stelle der positiven Zahlen geht für die 0 drauf. Somit ist der Wertebereich von Vorzeichenbehafteten 24-bit-Zahlen: 8388608 bis 8388607
Hab ich das jetzt richtig verstanden?
Das heißt also von :
1 bis 8388608 bedeutet: -1 bis -8388608 und von
8388609 bis 16777215 bedeutet: (8388609 - 8388608) = 1 bis (16777215-8388608) = 8388607.

6F3721 = -7288609 und
DE6E42 = 14577218 /2 also 7288609 ....:?: :idea:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
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: Negativ - Werte einlesen

Beitrag von NicTheQuick »

Nein, nicht so. Eigentlich ist es am schönsten in Wiki erklärt: Zweierkomplement
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Negativ - Werte einlesen

Beitrag von Skiller »

"Zweierkomplement" :idea:
Das war das Zauberwort. Hab´s geschnallt. Im Forum hat´s einiges davon. :allright: Thx!!!
Antworten