1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • PC Sicherung Komplett

    • Andy
    • 22. Dezember 2014 um 16:22
    Zitat von Alina

    Oder wäre es eher ratssam, was mir gerade einfällt, die Recover-Partition EINMAL
    abzusichern (gleiche Hardware in den PC's gegeben) und dann auslesen lassen
    irgendwie, wo der Unterschied zu "Betriebssystempartition ist" und dann nur pro PC
    einmal die Unterschiede absichern. Sinnvoll? Dumme Idee?

    Also wenn ich das alles zusammenfasse läuft es auf ein einmaliges Komplettbackup hinaus.
    Die sicherste, schnellste und einfachste Lösung ist da kein rumgezackere mit irgendwelchen proprietären Backup- und Restore-Programmen, sondern ein simples
    dd if=/dev/hda of=/dev/hdb
    einer beliebigen Linux-Distribution, welches die Sektoren 1:1 von der alten Platte auf eine neue kopiert. Kein Stress mit Recovery- und allen anderen Platten.
    Wenn irgenwann mal Rechner/Platten ausfallen, ist das Restore innerhalb von 1 Minute erledigt. Rechner auf, Platten tauschen, Rechner zu, weiterarbeiten.

    Für die Softwareliebhaber gibts auch Acronis True Image. Ist regelmäßig als kostenlose Version auf Computerzeitschrift-CD´s enthalten.
    Hatte ich früher mal im Einsatz, hat aber wie alle anderen Backuplösungen keinerlei Vorteile mehr bei den heutigen Plattenpreisen!

  • StringRegExp Zeilenumbrüche

    • Andy
    • 22. Dezember 2014 um 09:51

    Ja, das Problem mit der Zeit hatte ich ich während der Entwicklung (im Onlinetool) recht oft.
    Wenn dort nach 2 Sekunden kein Treffer erfolgt, wird abgebrochen.

    Zitat von AspirinJunkie

    Ich dachte mir: Warum soll ich ihn unnötigerweise weiter suchen lassen als nötig?

    Ich dachte mir: Sackzement, nach 4h rumprobieren und Dokus lesen hat´s endlich funktioniert! 8)

  • DLLs in Perseus schreiben und in AutoIt nutzen

    • Andy
    • 22. Dezember 2014 um 09:42

    Hi minx,

    hat sich bzgl. Dll schon etwas getan, bzw. woher kommt, dass

    push ebp
    mov ebp, esp

    entgegen allen Konventionen irgendwo im Code geschrieben, und damit der Stack durcheinandergewürfelt wird?

  • The Perseus Programming Language

    • Andy
    • 22. Dezember 2014 um 02:12
    Zitat von minx

    Was ist AutoIt eigentlich? Ein Sammlung von Funktionen, welche die WinAPI so dermaßen abstrahieren, dass tonnenweise neue Probleme enstehen:

    GuiCtrlCreateButton ist eine Standard-Klasse
    GuiCtrlCreateCombo ist eine CommonControls-Klasse (muss erst initialisiert werden)
    GuiCtrlCreateGraphic ist nichtmal ein Control, sondern ein abstrakter Wrapper für GDI

    das führt zu einer komplexen Überladung jeder AutoIt-Funktion (wie GuiCtrlSetData), was wiederrum für etwa 50% der Hilfethreads verantwortlich ist.

    Wenn du das wirklich ernst meinst, dann frage ich mich, wieso du nicht einen massiv gepimpten Assembler (MasmBasic, JWasm) nimmst, statt einen Compiler, der doch sowieso nur ein Abklatsch der bestehenden "abstrahierenden" Sprachen darstellt?!
    Wasch mich, aber mach mich nicht nass! 8)

    Entweder man "wrappert", oder man called die API nativ.
    Ich persönlich bin dann fürs wrappern, wenn man dazu bei immer wiederkehrenden Abläufen EINE Funktion mit Parametern versorgen kann. Und diese wiederum verteilt diese Parameter dann an zig andere (meinetwegen API-) Funktionen.
    Nichts anderes ist Klasse.Func oder Funktionen aus jedweger Bibliothek!
    Eine Bezeichnung für eine ganze Latte Code!

    Der Eiertanz zwischen der nativen Verwendung von API-Funktionen (früher aus dem BIOS gecalled) und dem Vorhaben, den Usern Schreibkram abzunehmen (nichts anderes machen HLL), ist so alt wie die Programmiersprachen selbst.
    Die Frage ist jetzt, ob man, wie bei AutoIt, Funktionen "überlädt" und damit für die 08/15-User einfach handlebar macht, oder ob man den "richtigen" Programmierern (höhö) ein flexibles und schnelles Werkzeug an die Hand gibt!

    Zitat von »FlutterShy™

    Einen autoit compiler finde ich keine gute idee. minx müsste sich mit so viel zeugs rumschlagen und außerdem ist im originalen autoit code ja nichtmal threading vorhanden. wie soll er das in die syntax gescheit einabauen? darauf möchte sicherlich keiner freiwillig verzichten.

    Passt zum Thema!
    "Mit Zeugs rumschlagen" ist genau das, was ich oben geschrieben habe, gemeint.
    Die schönen "gewrapperten" Funktionen wieder auseinanderdröseln....
    Aber das macht JEDER Compilerbauer!

    Auf die Frage, wie Threading in die AutoIt-Syntax einzubauen ist, nehme ich keine Stellung. Ich frage mich nur, wieso "keiner darauf verzichten will", aber Threading in maximal 0,1% aller Programme eingesetzt wird?! Und in den mir bekannten AutoIt-Scripten überhaupt keinen Sinn machen würde, weil dafür garkein Bedarf besteht!
    Wobei ich persönlich übrigens der Meinung bin, dass SIMD wesentlich mehr bringt als Threading...

    Die Frage ist sowieso eine ganz andere, nämlich ob moderne Rechnerarchitekturen überhaupt von der heutigen Software abgedeckt werden!
    Wer heutzutage einen Compiler baut, der sollte sich auch fragen lassen (müssen) ob die in den heutigen Prozessoren vorhandenen Features abgedeckt werden!
    Oder soll man für "spezielle" Softwareanforderungen einfach nur hochoptimierte Bibliotheken einbinden?!
    Was die Frage erlaubt, wozu man dann einen Compiler baut, wenn ein Interpreter (*hust*) die hochoptimierte Funktion aus der Bibliothek genauso schnell ausführt?!

    Zitat

    ...was wiederrum für etwa 50% der Hilfethreads verantwortlich ist.

    Wann hast du das letzte Mal ein Java/C(++)/Fortran/ADA/E/Android/wasauchimmer-Forum besucht?
    Die Hilfethreads könnten also vermieden werden, wenn "einfachere" Funktionen verwendet werden? :rofl:
    Auf 95% der Hilfethreads könnte man antworten: "Lies MSDN, da steht alles!" oder einfach RTFM!
    Schon seltsam, dass man diesen Hinweis einem "Programmierer" überhaupt geben muss...

  • StringRegExp Zeilenumbrüche

    • Andy
    • 22. Dezember 2014 um 00:30

    Mit dem RegEx und negativem Lookahead war ich mittlerweile auch dabei, es wird langsam!
    Aber AspirinJunkie war mal wieder schneller :thumbup:

    Ich hatte statt \N aber \b und auch "greedy" gesucht statt wie AspirinJunkie "lazy".
    Da negativer Lookahead doch sowieso die in dieser Gruppe enthaltenen Pattern NIEMALS treffen soll?!

    @steffen
    ich benutze online https://regex101.com
    der erklärt immer so schön^^

  • StringRegExp Zeilenumbrüche

    • Andy
    • 21. Dezember 2014 um 20:22

    Probiers mal mit

    //EDIT
    Mit Regex hat´s nicht hingehauen wegen fehlendem Skill, daher "zu Fuß" :D

    [autoit]

    #include <Array.au3>
    $a=fileread("Test_ID.txt")

    [/autoit][autoit][/autoit][autoit]

    $Suchstring="typeID: 2048"

    [/autoit][autoit][/autoit][autoit]

    $rep=StringRegExpReplace($a,'(?isU)\b(\d+:)',chr(255) & @crlf&'$0') ;splitten
    $split=stringsplit($rep,chr(255),3)

    [/autoit][autoit][/autoit][autoit]

    $ret=""
    for $i in $split
    if stringinstr($i,$Suchstring) then ;wenn treffer
    $t=stringsplit($i,@crlf,3)
    $ret=$t[1] ;erster String
    endif
    next

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,0,$ret)

    [/autoit]
  • OrganizeIncludes zeigt nicht alle Includes an

    • Andy
    • 21. Dezember 2014 um 19:52

    2 Zeilen hinzugefügt, dann klappts auch mit OI

    Funktion ersetzen:

    Spoiler anzeigen
    [autoit]

    Func _getFunctionCallsFromSource(ByRef $source)
    Local $usedFunctions_A, $call_A, $GUIRegisterMsg_A
    Local $usedFunctions_B
    ;~ $usedFunctions_A = StringRegExp($source, '(?i)(?<!\.)\b(\w+)[ ]*\(\h*[\(\)|\w|\$]', 3) ;best
    ;~ $usedFunctions_A = StringRegExp($source, '(?i)(?<!\.|\\|\$|Func\s*)\b(\w+?)[ \t]*\(', 3) ; test
    ;~ $usedFunctions_A = StringRegExp($source, '(?<!\.|\\)\b(\w+)[ \t]*\(.*?\)', 3) ; geht auch
    $usedFunctions_A = StringRegExp($source, '(?<!\.|\\|\$)\b(\w+?)[ \t]*\(', 3) ; test

    [/autoit] [autoit][/autoit] [autoit]

    $usedFunctions_B = StringRegExp($source, '(?i)GUI(?:|Ctrl)SetOnEvent\s*\([^,]+,\W*([\w_]+)\W*\)',3) ;by Andy
    _ArrayConcatenate ($usedFunctions_A,$usedFunctions_B) ;by Andy

    If StringInStr($source, 'call', 2) Then
    $call_A = StringRegExp($source, '(?i)call\s*\(\s*[\x22\x27](\w+)', 3) ; ggf. umstellen auf Stringfunktionen
    If IsArray($call_A) Then _ArrayConcatenate($usedFunctions_A, $call_A)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If StringInStr($source, 'GUIRegisterMsg', 2) Then
    $GUIRegisterMsg_A = StringRegExp($source, '(?i)GUIRegisterMsg\s*\(\s*\$\w+\s*,\s*[\x22\x27](\w+)', 3) ; ggf. umstellen auf Stringfunktionen
    If IsArray($GUIRegisterMsg_A) Then _ArrayConcatenate($usedFunctions_A, $GUIRegisterMsg_A)
    EndIf
    If IsArray($usedFunctions_A) Then Return $usedFunctions_A
    Return -1
    EndFunc ;==>_getFunctionCallsFromSource

    [/autoit]
  • OrganizeIncludes zeigt nicht alle Includes an

    • Andy
    • 21. Dezember 2014 um 18:54

    @stiffn,
    nein, das war keine Anmache! :D
    Anmache von mir sieht anders aus, glaubs mir....

    Zitat von stiffn

    Wenn ich _exFunktionB() alleine in eine Zeile schreibe wird das auch von OI richtig erkannt und die extern.au3 als Notwendigen Include vermerkt.


    Genau so siehts aus.

    Zitat von stiffn

    Verstehe nur noch nicht ganz wieso

    AutoIt-Quellcode

    GUICtrlCreateButton("Konnektor", 10, 60, 100, 40)
    GUICtrlSetOnEvent(-1, "_exFunktionB")


    keine "echter" aufrufe der Funktion ist, sondern nur Text, wiederum das ganze dann doch funktioniert wenn ich den Button klicke?!

    Das kommt daher, weil der AutoIt-Interpreter den "Text" innerhalb der Funktion GUICtrlSetOnEvent() als Funktion interpretiert, aber OrganizeInclude das NICHT macht!
    Du könntest OrganizeIncudes dahingehend erweitern bzw. abändern, allerdings würde das etwas aufwendig für einen Anfänger.

    Ich setze mich mal dran, habe OI sowieso schon mehrmals auf meine Belange angepasst....

  • OrganizeIncludes zeigt nicht alle Includes an

    • Andy
    • 21. Dezember 2014 um 17:14
    Zitat von Tweaky

    Wenn diese Datei im gleichen Ordner wie das Hauptskript liegt bin ich mir nicht sicher, ob sie erkannt wird.

    Die Datei wird deshalb nicht eingelesen, weil die in dieser Datei enthaltenen Funktionen NICHT im Hauptscript enthalten sind!
    Ich warte immer noch auf die Antwort auf meine Frage, WO IM HAUPTSCRIPT die Funktionen stehen!

  • Geschwindigkeitsoptimierung in AutoIt

    • Andy
    • 21. Dezember 2014 um 09:44
    Zitat von UEZ

    Das würde bedeuten, dass mein Prozessor die nichts tuende Schleife einfach ignoriert und deshalb es zu dem Faktor 12 kommt.

    Nein, der Prozessor ignoriert das imho nicht, ich bin überzeugt, dass der Code ausgeführt wird!

    [autoit]


    For $v = 10 To 22
    $t = TimerInit()
    $s = 2 ^ $v
    For $i = 1 To $s ;leere Schleife
    Next
    $m = TimerDiff($t)
    ConsoleWrite($v & " $i=" & $i & " Zeit=" & $m & @CRLF)
    Next

    [/autoit]

    Skaliert eindeutig!

    "Leere" Schleifen optimieren die gängigen Compiler weg, einem Interpreter diese Tricks beizubringen, ist etwas zuviel verlangt :), wozu auch?

  • OrganizeIncludes zeigt nicht alle Includes an

    • Andy
    • 21. Dezember 2014 um 09:15

    Nur fürs Verständnis, OI erkennt keine Funktionen innerhalb eines TEXTES!

    In deinem Script existieren keine Funktionen.
    Beispiel:

    [autoit]

    dim $a[1] = [1234]

    [/autoit][autoit][/autoit][autoit]

    $b = "_ArrayDisplay($a)" ;das ist ein Text, keine Funktion

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,0,$b)

    [/autoit][autoit]


    dim $a[1] = [1234]

    [/autoit][autoit][/autoit][autoit]

    $b = _ArrayDisplay($a) ;das ist eine Funktion, wird von OI gefunden

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,0,$b)

    [/autoit]
  • OrganizeIncludes zeigt nicht alle Includes an

    • Andy
    • 21. Dezember 2014 um 08:57

    unerheblich...

    Frage: WO WIRD IN DEINEM SCRIPT EINE FUNKTION AUFGERUFEN?
    Antwort: ES WIRD KEINE FUNKTION AUFGERUFEN!

    Ergo, wenn OI keine Funktion(en) in deinem Hauptscript findet, kann es auch diese Funktionen in den Scripten in den angegebenen Verzeichnissen nicht suchen!

  • OrganizeIncludes zeigt nicht alle Includes an

    • Andy
    • 21. Dezember 2014 um 08:16

    Zeig mir mal, wo dein Script eine der FUNKTIONEN AUFRUFT :P
    Diese Funktionen werden nirgends aufgerufen, sie sind ein TEXT innerhalb einer weiteren Funktion.
    Alles klar jetzt? :rolleyes:

  • Cron-Tab, der "Büro-Sklave"

    • Andy
    • 21. Dezember 2014 um 07:29

    Cron daemons habe ich schon Mitte der 80er Jahre (also im vorigen Jahrtausend ) benutzt.
    Da waren Cronjobs "in", um zeitgesteuert Aufgaben auf UNIx-Systemen zu starten.
    Die Steuerdaten (Tabellen, daher Cron-TAB) waren kryptisch, s.o.

    30 Jahre später benutze ich dazu idR Windows-eigene Software (jaja, auch Klickibunti).
    Erzähl mal heutzutage einem 08/15 Mac-User, dass er Cron-Tabs schreiben soll :rofl:

  • The Perseus Programming Language

    • Andy
    • 20. Dezember 2014 um 22:32

    Wenn Perseus AutoIt-Code compilieren würde, wären mir die 13 Gig SCHEISSEGAL 8o

  • Textdateien durchsuchen und einen String einfügen / entfernen

    • Andy
    • 20. Dezember 2014 um 18:33

    Hi,
    in der deutschen Hilfe findest du alles, was du für dein Vorhaben benötigst.
    Eine Suche sollte man aber durchführen können! Wenn du nicht weißt, wie man "richtig" sucht, frag!

    Ein Programm macht nichts anderes, was man auch "zu Fuß" machen würde, nur schneller und öfter...
    Ein Workflow, wie man dein Vorhaben von Hand durchführt, würde ich einfach in ein script überführen.

    Von Hand:
    1) Verzeichnis öffnen, und nach *.txt-Dateien filtern
    2) *.txt-Datei öffnen
    3) mit "Suchen und Ersetzen" Text ersetzen (mit "" (nichts) ersetzen =löschen)
    4) Datei speichern (überschreiben)
    5) nach 2)

    AutoIt-Befehle, die helfen könnten...
    1) filereadtoarray()
    2) fileread()
    3) stringreplace()
    4) filewrite() (vorher löschen mit filedelete)
    5) For IN

  • MP3 Tag auslesen

    • Andy
    • 20. Dezember 2014 um 11:40

    Wer lesen kann, ist klar im Vorteil :P

    Code
    UDF Description ..............:        Reads/Writes ID3v1.1 ID3v2.3, ID3v2.4 and APEv2 Tags in MP3 files
    UDF AutoIt Forum Link.........:        http://www.autoitscript.com/forum/index.php?showtopic=43950&st=0
    UDF AutoIt Version Required...:        23rd December, 2011 - v3.3.8.0 of AutoIt
    FUNCTIONS LIST ...............:


    Einfaches copy & paste ist eben nicht immer der Weisheit letzter Schluß!

  • MP3 Tag auslesen

    • Andy
    • 20. Dezember 2014 um 11:29
    Zitat von MrB

    OK, dachte es gibt so was ähnliches wie die ID3_v3.4.au3, also mehr Funktionen.

    Habe eben den orginal Thread im am. Forum überflogen, dazu gibts wohl nichts weiter zu sagen...

    Zitat von MrB

    Naja, mit Mediamonkey oder WinExplorer bekomm ich Titel und Interpret angezeigt.

  • MP3 Tag auslesen

    • Andy
    • 20. Dezember 2014 um 10:51

    Das ist die komplette UDF!
    Wenn dort nichts ausgelesen werden kann, ist auch in der Datei nichts vorhanden bzw. ein anderes (neueres ? ) Format verwendet.

    Zitat von MrB

    Wird zwar kaum was ausgegeben, aber wenigstens ein wenig.


    Wie kommst du darauf, dass in den Dateien mehr Daten enthalten sind?

  • MP3 Tag auslesen

    • Andy
    • 20. Dezember 2014 um 10:37

    Oscars UDF funktioniert einwandfrei....

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <FileConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $File = FileOpenDialog("Auswahl", "", "Musik (*.mp3)")

    [/autoit] [autoit][/autoit] [autoit]

    If not @error And $File <> "" Then
    $tag = _Readid3Tag($File)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $tag = ' & $tag & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    _arraydisplay($tag)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; Function Name: _ReadID3Tag($sPath)
    ; Description:: gibt ein Array mit den Daten aus den ID3-Tags zurück
    ; unterstützt werden die ID3-Tag-Versionen 1.0, 1.1, 2.3 und 2.4
    ; bei v2.4 müssen sich die ID3-Tags am Anfang der Datei befinden
    ; Parameter(s): $sPath = Pfad zu einer MP3-Datei
    ; Requirement(s): min. AutoIt v3.3.0.0
    ; Return Value(s): bei Erfolg: Array mit den ID3-Tagdaten (@error = 0)
    ; im Fehlerfall bekommt @error:
    ; 1 = Datei existiert nicht
    ; 2 = Datei konnte nicht zum lesen geöffnet werden
    ; 3 = falsche ID3 v2 Version
    ; 4 = Datei ist keine MP3-Datei
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _ReadID3Tag($sPath)
    If Not FileExists($sPath) Then Return SetError(1, 0, 0)
    Local $hFile, $sData, $sID3Header, $iID3HeaderSize = 0, $iOffset, $iSize, $tmp
    Local $aID3v2Tags[8] = ['TIT2', 'TPE1', 'TALB', 'TYER', 'TLEN', 'TRCK', 'TCON', 'TENC']
    Local $aID3[11][2] = [ _
    ['Title', ''],['Artist', ''],['Album', ''],['Year', ''], _
    ['Length', '0'],['Track', ''],['Genre', ''],['Encoder', ''], _
    ['MPEG-Version', ''],['Bitrate', ''],['Sample-Freq.', '']]
    Local $aMP3Version[4] = ['MPEG2.5', 'Reserved', 'MPEG2', 'MPEG1']
    Local $aMP3Layer[4] = ['Reserved', 'Layer III', 'Layer II', 'Layer I']
    Local $aMP3Bitrate[5][16] = [ _
    [000, 032, 064, 096, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 000], _
    [000, 032, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 384, 000], _
    [000, 032, 040, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 000], _
    [000, 032, 048, 056, 064, 080, 096, 112, 128, 144, 160, 176, 192, 224, 256, 000], _
    [000, 008, 016, 024, 032, 040, 048, 056, 064, 080, 096, 112, 128, 144, 160, 000]]
    Local $aSampleFreq[3][4] = [[44100, 48000, 32000, 0],[22050, 24000, 16000, 0],[11025, 12000, 8000, 0]]
    Local $sMP3FrameHeader, $iMP3Version, $sMP3Version, $sMP3Layer, $iMP3Bitrate, $iMP3SampleFreq
    Local $iVBRFrames = -1, $iVBRFilesize, $iVBRFlags
    $hFile = FileOpen($sPath, 16)
    If $hFile = -1 Then Return SetError(2, 0, 0)
    $sData = Binary(FileRead($hFile, 4))
    If BinaryMid($sData, 1, 3) = '0x494433' Then ; ID3 v2.x Kennung gefunden
    If (BinaryMid($sData, 4, 1) = '0x03') Or (BinaryMid($sData, 4, 1) = '0x04') Then ; nur v2.3 und 2.4
    FileRead($hFile, 2) ; 2 Bytes überspringen
    For $i = 0 To 3 ; berechne ID3-Headergröße (4 Bytes, jedoch nur jeweils die unteren 7 Bit)
    $iID3HeaderSize = BitShift($iID3HeaderSize, -7) + BitAND(Binary(FileRead($hFile, 1)), 0x7F)
    Next
    If $iID3HeaderSize > 0 Then
    $sID3Header = Binary(FileRead($hFile, $iID3HeaderSize)) ; lese gesamten ID3-Header
    For $i = 0 To 7
    $iOffset = StringInStr(BinaryToString($sID3Header), $aID3v2Tags[$i]) ; Offset zu dem ID3-Tag
    If $iOffset > 0 Then
    $iSize = Hex(BinaryMid($sID3Header, $iOffset + 4, 4)) ; Größe des ID3-Frames
    $tmp = BinaryMid($sID3Header, $iOffset + 11, Dec($iSize) - 1)
    If BinaryMid($tmp, 1, 2) = '0xFFFE' Then
    For $x = 3 To BinaryLen($tmp) Step 2
    $aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 2), 2)
    Next
    Else
    For $x = 1 To BinaryLen($tmp)
    $aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 1))
    Next
    EndIf
    $aID3[$i][1] = StringReplace($aID3[$i][1], Chr(0), '')
    EndIf
    Next
    EndIf
    Do
    $sData = String(FileRead($hFile, 1))
    If @error Then ExitLoop
    If BitAND($sData, 0xff) = 0xff Then
    FileSetPos($hFile, -1, 1)
    $sData = String(FileRead($hFile, 4))
    EndIf
    Until BitAND($sData, 0xFFE00000) = 0xFFE00000
    Else
    FileClose($hFile)
    Return SetError(3, 0, 0)
    EndIf
    Else ; ID3 v1.x
    $iOffset = FileGetPos($hFile)
    FileSetPos($hFile, -128, 2)
    $sID3Header = BinaryToString(FileRead($hFile, 3))
    If $sID3Header = 'TAG' Then
    $aID3[0][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
    $aID3[1][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
    $aID3[2][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
    $aID3[3][1] = StringReplace(BinaryToString(FileRead($hFile, 4)), Chr(0), '')
    EndIf
    FileSetPos($hFile, $iOffset, 0)
    EndIf
    $sMP3FrameHeader = String($sData)
    If BitAND($sMP3FrameHeader, 0xFFE00000) <> 0xFFE00000 Then
    FileClose($hFile)
    Return SetError(4, 0, 0) ; keine MP3-Datei, dann Return
    EndIf
    $iMP3Version = BitShift(BitXOR($sMP3FrameHeader, 0xFFE00000), 19) ; welche MP3-Version
    $sMP3Version = $aMP3Version[$iMP3Version] ; in Textform
    $sMP3Layer = $aMP3Layer[BitShift(BitAND($sMP3FrameHeader, 0x60000), 17)] ; welcher Layer
    $aID3[8][1] = $sMP3Version & ' / ' & $sMP3Layer ; ins Ausgabe-Array
    $iMP3Bitrate = BitShift(BitAND($sMP3FrameHeader, 0xF000), 12) ; Bitraten-Index auslesen
    Switch $sMP3Version ; je nach MPEG-Version Bitrate aus der Tabelle holen
    Case 'MPEG1'
    $aID3[9][1] = $aMP3Bitrate[$iMP3Version - ($iMP3Version > 1)][$iMP3Bitrate]
    Case 'MPEG2', 'MPEG2.5'
    If $sMP3Layer = 'Layer I' Then
    $aID3[9][1] = $aMP3Bitrate[3][$iMP3Bitrate]
    Else
    $aID3[9][1] = $aMP3Bitrate[4][$iMP3Bitrate]
    EndIf
    EndSwitch
    $iMP3SampleFreq = BitShift(BitAND($sMP3FrameHeader, 0xC00), 10) ; Sample-Frequenz-Index auslesen
    $aID3[10][1] = $aSampleFreq[2 - ($iMP3Version - ($iMP3Version > 1))][$iMP3SampleFreq] ; und Wert aus der Tabelle holen
    Do ; evtl. Leerbytes überspringen
    $tmp = FileRead($hFile, 1)
    If @error Then ExitLoop
    Until $tmp <> 0x00 Or @error
    If $tmp = 0x58 And BinaryToString(FileRead($hFile, 3)) = 'ing' Then ; MP3 mit VBR (Xing-Header gefunden)?
    $iVBRFlags = '0x' & Hex(FileRead($hFile, 4)) ; VBR-Flags auslesen
    If BitAND($iVBRFlags, 0x3) Then ; wenn die Einträge vorhanden sind, dann...
    $iVBRFrames = Dec(Hex(FileRead($hFile, 4))) ; Anzahl der VBR-Frames auslesen
    $iVBRFilesize = Dec(Hex(FileRead($hFile, 4))) ; Dateigröße auslesen
    $aID3[4][1] = $iVBRFrames * 1152 / $aID3[10][1] * 1000 ; VBR Laufzeit
    $aID3[9][1] = 'VBR ~' & Int($iVBRFilesize * 8 / ($aID3[4][1] / 1000) / 1000) ; VBR durchschnittliche Bitrate
    EndIf
    Else
    If $aID3[4][1] = 0 Then $aID3[4][1] = (FileGetSize($sPath) * 8) / ($aID3[9][1] * 1000) * 1000 ; alternative CBR Laufzeit
    $aID3[9][1] = 'CBR ' & $aID3[9][1]
    EndIf
    $aID3[4][1] = _MyTicksToTime($aID3[4][1]) ; Laufzeit (Ticks to hour:min:sec)
    $aID3[9][1] &= ' kBit/s'
    $aID3[10][1] &= ' Hz'
    FileClose($hFile)
    Return $aID3
    EndFunc ;==>_ReadID3Tag

    [/autoit] [autoit][/autoit] [autoit]

    Func _MyTicksToTime($iTicks)
    Local $iHour, $iMins, $iSecs
    $iHour = Int($iTicks / 3600000)
    $iTicks -= $iHour * 3600000
    $iMins = Int($iTicks / 60000)
    $iTicks -= $iMins * 60000
    $iSecs = Int($iTicks / 1000)
    Return StringFormat('%02i:%02i:%02i', $iHour, $iMins, $iSecs)
    EndFunc ;==>_MyTicksToTime

    [/autoit]

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™