Negativ - Werte einlesen
Negativ - Werte einlesen
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 !!!
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 !!!
- 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
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
EndProcedureRe: Negativ - Werte einlesen
Hi Nick,
danke für die schnelle Antwort. Werde mich heute damit beschäftigen.
Gruß Skiller
danke für die schnelle Antwort. Werde mich heute damit beschäftigen.
Gruß Skiller
Re: Negativ - Werte einlesen
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?
Gruß Skiller
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?
Gruß Skiller
Re: Negativ - Werte einlesen
Woher hast Du denn das -15 777 216?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
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
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
- 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
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
EndDataSectionRe: Negativ - Werte einlesen
Geht mir auch so.NicTheQuick hat geschrieben:Also egal wie ich es versuche. Da kommt kein -15777216 raus.
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 >> 8cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: Negativ - Werte einlesen
Hallo,
guten Morgen und vielen Dank erstmal.
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 ....

guten Morgen und vielen Dank erstmal.
Hab ich das jetzt richtig verstanden?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
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 ....
- 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
Nein, nicht so. Eigentlich ist es am schönsten in Wiki erklärt: Zweierkomplement
Re: Negativ - Werte einlesen
"Zweierkomplement"
Das war das Zauberwort. Hab´s geschnallt. Im Forum hat´s einiges davon.
Thx!!!
Das war das Zauberwort. Hab´s geschnallt. Im Forum hat´s einiges davon.