ByteChecker- Statistikspielerei

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

ByteChecker- Statistikspielerei

Beitrag von Franky »

Hi Leute.
Zuerst mal: Wer nach sinn sucht, ist hier falsch.

Ich hatte Langeweile (bzw. hab versucht mich vom Abilernen ab zu lenken) und da viel mir ein, dass ich doch schon immer mal wissen wollte, wie wohl die Verteilung der Bytewerte auf meiner Festplatte ist, also wie oft davon ne 123, ne 34 oder ne 0 vertreten ist und was wohl der Durchschnittswert ist. Daher hab ich mir folgendes kleines Tool geschrieben. Es beachtet zwar nicht alles (zum Beispiel ist das Dateisystem ja auch wo gespeichert und so weiter) aber es geht immerhin alle Dateien durch, mit denen man arbeiten kann.

Bei mir war der Durchschnittswert 111.2, wie sieht´s bei euch aus? :)



Code: Alles auswählen

Global Dim Bytes.q(255)
Global Allbytes.q
Global Buffersize.l=1000000
Global buffer.l
Global wert.l
Global Array.l=@Bytes(0)
Global mainthread.l
Global momname.s
Global Momdurchschnitt.d
Global Files.q
Global FilesWork.q
Global Didnot.q

Global maxwert.l

Procedure TestBuffer(buffer2.l,Size.l)
Protected *adr.Byte ,ende.l
      size=size-1
      *adr=buffer2 
      ende=*adr+size      
      Repeat 
           Bytes(*adr\b&$FF)+1
           *adr+1
      Until *adr>ende 
EndProcedure


Procedure CheckFile(name.s)
      menge.l=FileSize(name)
      files=files+1
      If ReadFile(1,name)
           fileswork=fileswork+1
           Allbytes=Allbytes+menge
           While menge=>Buffersize
                  menge=menge-Buffersize                  
                  ReadData(1,buffer,Buffersize)
                  TestBuffer(buffer,Buffersize)
           Wend
            If menge>0
                 ReadData(1,buffer,menge)
                 TestBuffer(buffer,menge)
            EndIf
           CloseFile(1)
      Else 
         Didnot=Didnot+menge
      EndIf
EndProcedure


Procedure CheckDirectory(name.s)
Static NR.l
        nr=nr+1
       If  ExamineDirectory(nr,name,"*.*")
            While NextDirectoryEntry(nr)              
                     If Left(DirectoryEntryName(nr),1)<>"."
                            momname.s=name+DirectoryEntryName(nr)
                            Select DirectoryEntryType(nr)
                                 Case #PB_DirectoryEntry_Directory
                                       CheckDirectory(name+DirectoryEntryName(nr)+"\")
                                 Case #PB_DirectoryEntry_File
                                       CheckFile(name+DirectoryEntryName(nr))
                            EndSelect
                     EndIf
                Wend 
        EndIf
NR=NR-1        

EndProcedure


Procedure CheckAll()
buffer=AllocateMemory(Buffersize)
  SetGadgetText(3,"Bin am Rechnen")
  DisableGadget(3,1)
  CheckDirectory("\")
  SetGadgetText(3,"Fertig")
FreeMemory(buffer)  
        Dim MyBytes.q(255)
        CopyMemory(@Bytes(0),@MyBytes(0),2048)        
        max=0
        For a=0 To 255
           If max<MyBytes(a)
                   max=MyBytes(a)
                   maxwert=a
           EndIf
        Next 
        nummer.s=StrQ(Allbytes) 
        string.s=""
        For a=1 To Int(Len(nummer)/3)
              string.s=Mid(nummer,Len(nummer)-(a)*3,3)+"."+string
        Next 
        If Len(nummer)%3<>0         
              string=Left(nummer,Len(nummer)%3)+"."+string
        EndIf
        nummer=string

        nummer2.s=StrQ(Didnot) 
        string.s=""
        For a=1 To Int(Len(nummer2)/3)
              string.s=Mid(nummer2,Len(nummer2)-(a)*3,3)+"."+string
        Next 
        If Len(nummer2)%3<>0         
              string=Left(nummer2,Len(nummer2)%3)+"."+string
        EndIf
        nummer2=string 
        
        durchsch.d=0
        For a=0 To 255
            wert2.q=a*Bytes(a)
            durchsch=durchsch+wert2/Allbytes
        Next
MessageRequester("Ergebnis:","Es wurden "+StrQ(FilesWork)+" Dateien mit "+nummer+" Bytes überprüft"+Chr(13)+"Der Durchschnittliche Wert betrug "+StrD(durchsch)+Chr(13)+"Es konnten "+StrQ(files-FilesWork)+" Dateien nicht geprüft werden; Gesamtgröße: "+nummer2+" Bytes"+Chr(13)+"Der häufigste Wert war "+Str(maxwert))
EndProcedure


Procedure ShowData_Mom()
Protected durchsch.d
Repeat
        Dim MyBytes.q(255)
        CopyMemory(@Bytes(0),@MyBytes(0),2048)
        CreateImage(1,512,200)
        
        max=0
        For a=0 To 255
           If max<MyBytes(a)
                   max=MyBytes(a)
           EndIf
        Next 
        If max>0
                StartDrawing(ImageOutput(1))
                     FrontColor(255)
                      For a=0 To 255
                          LineXY(a*2+1,200,a*2+1,200-(MyBytes(a)*200/max))
                          LineXY(a*2+2,200,a*2+2,200-(MyBytes(a)*200/max))          
                      Next 
                StopDrawing()
        EndIf
        SetGadgetState(1,ImageID(1))    
        nummer.s=StrQ(Allbytes) 
        string.s=""
        For a=1 To Int(Len(nummer)/3)
              string.s=Mid(nummer,Len(nummer)-(a)*3,3)+"."+string
        Next 
        If Len(nummer)%3<>0         
              string=Left(nummer,Len(nummer)%3)+"."+string
        EndIf
        durchsch=0
        For a=0 To 255
            wert2.q=a*Bytes(a)
            durchsch=durchsch+wert2/Allbytes
        Next
        SetGadgetText(2,"Gezählte Bytes: "+string)
        SetGadgetText(6,momname)
        SetGadgetText(7,"Durchschnittswert:"+StrD(durchsch))
        Delay(100)
Until IsThread(mainthread)=0
Debug "HI"
EndProcedure


If OpenWindow(1,100,100,600,300,"Bytestatistiker")
        CreateGadgetList(WindowID(1))
                ImageGadget(1,0,0,512,200,0)
                TextGadget(2,0,220,300,20,"Noch nix gemacht")
                ButtonGadget(3,300,220,200,20,"Dann starte mal")
                StringGadget(6,0,240,600,20,"")
                TextGadget(7,0,260,600,20,"Durchschnittswert: 0")
                TextGadget(4,0,280,200,20,"X:0")
                TextGadget(5,200,280,200,20,"Y:0")
                
                Repeat 
                    event=WaitWindowEvent()
                    If event=#PB_Event_Gadget And EventGadget()=3
                                mainthread=CreateThread(@CheckAll(),0)
                                neben=CreateThread(@ShowData_Mom(),0)
                    EndIf
                    SetGadgetText(4,"X: "+Str(WindowMouseX(1)/2))
                    SetGadgetText(5,"y: "+Str(WindowMouseY(1)/2))
                    
                Until event=#WM_CLOSE
                If IsThread(mainthread)
                     KillThread(mainthread)
                EndIf
                CloseWindow(1)
EndIf                       

Wie gesagt, es ist nur ne spielerei, aber testet´s ruhig mal aus, wenn ihr grad rechenzeit frei habt, ist interessant, wie stark sich der Wert ändern kann, wenn plötzlich nur Dateien mit hohen oder niedrigen werten kommen.

Und sagt mir mal das Ergebnis, würd mich interessieren :) :) :)

bis denne Antenne
Franky
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
sen-me
Beiträge: 478
Registriert: 17.07.2005 16:02
Wohnort: Saarbrücken
Kontaktdaten:

Beitrag von sen-me »

Bei mir siehts aus wie PB4 ^^
Ich benutz kein PB4 - ich find 3.94 besser
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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

Beitrag von NicTheQuick »

Bei mir ist das Programm irgendwann abgestürzt. Aber den letzten
Screenshot hab ich noch:
Bild

War übrigens nicht mein Computer...
Antworten