Seite 1 von 1
Negativ - Werte einlesen
Verfasst: 31.03.2014 19:47
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 !!!
Re: Negativ - Werte einlesen
Verfasst: 31.03.2014 19:51
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
Re: Negativ - Werte einlesen
Verfasst: 01.04.2014 07:51
von Skiller
Hi Nick,
danke für die schnelle Antwort. Werde mich heute damit beschäftigen.
Gruß Skiller
Re: Negativ - Werte einlesen
Verfasst: 01.04.2014 08:46
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?
Gruß Skiller
Re: Negativ - Werte einlesen
Verfasst: 01.04.2014 10:26
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")?
Re: Negativ - Werte einlesen
Verfasst: 01.04.2014 11:34
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
Re: Negativ - Werte einlesen
Verfasst: 01.04.2014 11:50
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
Re: Negativ - Werte einlesen
Verfasst: 02.04.2014 07:54
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 ....

Re: Negativ - Werte einlesen
Verfasst: 02.04.2014 08:24
von NicTheQuick
Nein, nicht so. Eigentlich ist es am schönsten in Wiki erklärt:
Zweierkomplement
Re: Negativ - Werte einlesen
Verfasst: 02.04.2014 14:17
von Skiller
"
Zweierkomplement"
Das war das Zauberwort. Hab´s geschnallt. Im Forum hat´s einiges davon.

Thx!!!