Bei der Berechnung der TitelLänge einer MP3-Datei: "Die arithmetische Operation hat einen Überlauf verursacht."

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Bei der Berechnung der TitelLänge einer MP3-Datei: "Die arithmetische Operation hat einen Überlauf verursacht."

    Hallo ich arbeite zurzeit an einem Projekt welches die möglichkeit hat, MP3-Dateien zu sortieren. Soweit funktioniert auch alles ab und an schmeißt mir das Programm jedoch im Debugging eine Exception des Types System.overflow

    Ein Ausnahmefehler des Typs "System.OverflowException" ist in YTGet.exe aufgetreten.

    Zusätzliche Informationen: Die arithmetische Operation hat einen Überlauf verursacht.


    :(

    Die Exception wird im Sub GetDuration geworfen: GetDuration()

    Quellcode

    1. Private Mp3HeaderPosition, Mp3ClearSize As Integer
    2. ...
    3. Public Function GetDuration() As Integer
    4. Dim Duration As Integer = CInt(((Mp3ClearSize * 8) / GetBitrate()))
    5. Return Duration
    6. End Function
    7. Public Function GetBitrate() As Integer
    8. Dim BitrateArray() As Integer
    9. If GetMPEGType() = MPEGType.MPEG1 Then
    10. Dim TmpBitrateArray() As Integer = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320}
    11. BitrateArray = TmpBitrateArray
    12. Else
    13. Dim TmpBitrateArray() As Integer = {8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
    14. BitrateArray = TmpBitrateArray
    15. End If
    16. If Not IsVBR() Then
    17. Select Case Mp3HeaderBitsStr.BitrateBitsString
    18. Case "0001" : Return BitrateArray(0) * 1000
    19. Case "0010" : Return BitrateArray(1) * 1000
    20. Case "0011" : Return BitrateArray(2) * 1000
    21. Case "0100" : Return BitrateArray(3) * 1000
    22. Case "0101" : Return BitrateArray(4) * 1000
    23. Case "0110" : Return BitrateArray(5) * 1000
    24. Case "0111" : Return BitrateArray(6) * 1000
    25. Case "1000" : Return BitrateArray(7) * 1000
    26. Case "1001" : Return BitrateArray(8) * 1000
    27. Case "1010" : Return BitrateArray(9) * 1000
    28. Case "1011" : Return BitrateArray(10) * 1000
    29. Case "1100" : Return BitrateArray(11) * 1000
    30. Case "1101" : Return BitrateArray(12) * 1000
    31. Case "1110" : Return BitrateArray(13) * 1000
    32. End Select
    33. Else
    34. Dim CXingHeader As XingHeader = GetXingHeader()
    35. Dim LastByte, AverageFrameLenght, AverageBitrate As Integer
    36. 'For more info see : http://www.multiweb.cz/twoinches/MP3inside.htm#MP3FileStructure
    37. With CXingHeader
    38. LastByte = CInt((.TOC(99) / 256) * .FileLenght)
    39. AverageFrameLenght = CInt(.FileLenght / .NumberOfFrames)
    40. AverageBitrate = CInt(((AverageFrameLenght * GetSamplingRateFreq()) / 144) / 1000)
    41. End With
    42. Return AverageBitrate * 1000
    43. End If
    44. End Function

    MrTweek schrieb:

    Überlauf
    Verwende Long statt Integer.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habe ich bereits probiert, schmeißt er auch die exception... Die Lib ist nicht von mir, wurde mal bei Code-Project zur verfügung gestellt... ich vermute weil gesagt wird, dass eine variable keinen Wert hat, dass er den Stream nicht öffnen kann ich werde mal die 100erte Try & catches entfernen und mal schauen...

    *try und catch überall entfernt * schmeißt der Debugger eine IOException auf eine MP3-Datei : sie wird angeblich bereits verwendet :/ ...
    naja, aber ((Mp3ClearSize * 8) / GetBitrate())sieht eiglich nicht so aus, als dass es Integer.MaxValue überschreiten könnte. 9Mio * 8 ist glaub noch locker drin.
    Also wird GetBitrate einen erstaunlich kleinen Wert produzieren, ansonsten kann ich mir nicht erklären, warums an dieser Stelle so rausschießt.

    Also Debug-Aufgabe: Welchen Wert liefert GetBitrate() an dieser Stelle?


    edit: ah ja - ein Folgefehler aufgrund unangemessenen TryCatches - das ist natürlich auch ne Möglichkeit.
    Da kann vlt. eine Datei nicht gelesen werden, und deshalb ist GetBitrate 0, und ja, dann Überlauf.

    also jetzt so ins Blaue geraten... Auf jeden fall ist die IOException erstmal zu fixen (und nicht zu catchen).
    @ErfinderDesRades ich denk mal ne ignorierte Exception.
    @MrTweek Genau solch musst Du abfangen.
    Wenn Du schon Exceptions ignorierst, solltest Du die Variablen wenigstens default vorbelegen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!