Nun, wozu braucht man das ding?
Ich bin gerade bei PGS dabei, neue Dateiformate ein zu binden. Dazu kann man ja bei Wotsit.org viel zu den Dateiformaten finden. Einige Dinge allerdings fehlen da in der Doku, wodurch man sich teilweise echt die Zähne ausbeißen könnte am einbinden des neuen Formats. Mit diesem Programm kann man nun den Dateninhalt zweier Dateien miteinander vergleichen.
Funktionen:
Man kann alle Bytes, Words, Longs sowie ihre Stelle in der Datei anzeigen lassen, die nicht miteinander übereinstimmen.
Zudem vergleicht das Programm die Dateigrößen miteinander.
Der User kann einstellen, ob die Dateien nur bis zu einer Bestimmten Anzahl an Bytes verglichen werden.
Es können eigene HeaderListen zusammen gestellt werden (aus Longs Words und Bytes), die man auch speichern oder laden kann.
Das heißt ich kann dann zum beispiel eine Liste machen
Byte
Long
Word
Byte
Word
Dann liest er erst ein Byte, dann ein Long, dann ein Word, dann ein Byte und dann nochmal ein Word.
Zudem kann man auch in die Datei schreiben, was das austesten erleichtert was Passiert, wenn man diesen oder jenen Parameter des Headers verändert.
Vielleicht kann es ja mal wer gebrauchen, hier der Source
Code: Alles auswählen
Enumeration
#menu_header_laden
#menu_header_speichern
#menu_laden_1
#menu_laden_2
#menu_ende
#menu_hilfe
#menu_info
EndEnumeration
Enumeration
#ggt_panel
#ggt_bytes
#ggt_words
#ggt_longs
#ggt_daten
#ggt_header
#ggt_header_combo
#ggt_header_info
#ggt_header_add
#ggt_header_delete
#ggt_header_only
#ggt_header_length
#ggt_compare_intelligent
#ggt_compare
#ggt_stelle
#ggt_art
#ggt_wert1
#ggt_wert2
#ggt_lese
#ggt_schreibe_1
#ggt_schreibe_2
#ggt_datei1
#ggt_datei2
EndEnumeration
Structure Head
typ.s
info.s
tbytes.b
EndStructure
NewList Header.Head()
Global event.l
Global quit.l
Global datei1.s
Global datei2.s
Procedure ReadHeader()
UseFile(1)
FileSeek(0)
UseFile(2)
FileSeek(0)
x=0
ForEach Header()
Select Header()\tbytes
Case 1
UseFile(1)
d1=ReadByte()
UseFile(2)
d2=ReadByte()
Case 2
UseFile(1)
d1=ReadWord()
UseFile(2)
d2=ReadWord()
Case 4
UseFile(1)
d1=ReadLong()
UseFile(2)
d2=ReadLong()
EndSelect
SetGadgetItemText(#ggt_header,x,Str(d1),2)
SetGadgetItemText(#ggt_header,x,Str(d2),3)
INC x
Next
EndProcedure
Procedure ReadDataFromFile()
If GetGadgetState(#ggt_header_only)=1
fl=Val(GetGadgetText(#ggt_header_length))
Else
fl=FileSize(datei2)
EndIf
ClearGadgetItemList(#ggt_bytes)
ClearGadgetItemList(#ggt_words)
ClearGadgetItemList(#ggt_longs)
If ReadFile(1,datei1)
If ReadFile(2,datei2)
a=0
While Loc()<fl
UseFile(1)
d1.l=ReadByte()
UseFile(2)
d2.l=ReadByte()
If d1<>d2
AddGadgetItem(#ggt_bytes,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
EndIf
INC a
Wend
UseFile(1)
FileSeek(0)
UseFile(2)
FileSeek(0)
a=0
While Loc()<fl
UseFile(1)
d1.l=ReadWord()
UseFile(2)
d2.l=ReadWord()
If d1<>d2
AddGadgetItem(#ggt_words,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
EndIf
INC a
INC a
Wend
UseFile(1)
FileSeek(0)
UseFile(2)
FileSeek(0)
a=0
While Loc()<fl
UseFile(1)
d1.l=ReadLong()
UseFile(2)
d2.l=ReadLong()
If d1<>d2
AddGadgetItem(#ggt_longs,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
EndIf
INC a
INC a
INC a
INC a
Wend
ClearGadgetItemList(#ggt_daten)
AddGadgetItem(#ggt_daten,-1,"1"+Chr(10)+Str(FileSize(datei1)))
AddGadgetItem(#ggt_daten,-1,"2"+Chr(10)+Str(FileSize(datei2)))
ReadHeader()
CloseFile(2)
EndIf
CloseFile(1)
EndIf
EndProcedure
Procedure ReadDataFromFile_Intelligent()
If GetGadgetState(#ggt_header_only)=1
fl=Val(GetGadgetText(#ggt_header_length))
Else
fl=FileSize(datei2)
EndIf
ClearGadgetItemList(#ggt_bytes)
ClearGadgetItemList(#ggt_words)
ClearGadgetItemList(#ggt_longs)
If ReadFile(1,datei1)
If ReadFile(2,datei2)
a=0
pos=0
Dim werte.l(3)
Dim werte2.l(3)
While Loc()<fl
UseFile(1)
d1.l=ReadByte()
UseFile(2)
d2.l=ReadByte()
If d1<>d2
pos=Loc()-1
UseFile(1)
d1.l=ReadByte()
UseFile(2)
d2.l=ReadByte()
If d1<>d2
UseFile(1)
d1.l=ReadByte()
UseFile(2)
d2.l=ReadByte()
If d2<>d1
UseFile(1)
d1.l=ReadByte()
UseFile(2)
d2.l=ReadByte()
If d2<>d1
UseFile(1)
FileSeek(pos)
d1=ReadLong()
UseFile(2)
FileSeek(pos)
d2=ReadLong()
AddGadgetItem(#ggt_longs,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
ADD a,3
Else
UseFile(1)
FileSeek(pos)
d1=ReadWord()
UseFile(2)
FileSeek(pos)
d2=ReadWord()
AddGadgetItem(#ggt_words,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
UseFile(1)
d1=ReadByte()
UseFile(2)
d2=ReadByte()
AddGadgetItem(#ggt_bytes,-1,Str(a+2)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
ADD a,2
EndIf
Else
UseFile(1)
FileSeek(pos)
d1=ReadWord()
UseFile(2)
FileSeek(pos)
d2=ReadWord()
AddGadgetItem(#ggt_words,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
ADD a,1
EndIf
Else
UseFile(1)
FileSeek(pos)
d1=ReadByte()
UseFile(2)
FileSeek(pos)
d2=ReadByte()
AddGadgetItem(#ggt_bytes,-1,Str(a)+Chr(10)+Str(d1)+Chr(10)+Str(d2))
EndIf
EndIf
INC a
Wend
ClearGadgetItemList(#ggt_daten)
AddGadgetItem(#ggt_daten,-1,"1"+Chr(10)+Str(FileSize(datei1)))
AddGadgetItem(#ggt_daten,-1,"2"+Chr(10)+Str(FileSize(datei2)))
ReadHeader()
CloseFile(2)
EndIf
CloseFile(1)
EndIf
EndProcedure
Procedure WriteInFile_1()
pos=Val(GetGadgetText(#ggt_stelle))
wert.l=Val(GetGadgetText(#ggt_wert1))
If OpenFile(1,datei1)
FileSeek(pos)
Select GetGadgetState(#ggt_art)
Case 0
WriteByte(wert)
Case 1
WriteWord(wert)
Case 2
WriteLong(wert)
EndSelect
CloseFile(1)
EndIf
EndProcedure
Procedure WriteInFile_2()
pos=Val(GetGadgetText(#ggt_stelle))
wert.l=Val(GetGadgetText(#ggt_wert2))
If OpenFile(2,datei2)
FileSeek(pos)
Select GetGadgetState(#ggt_art)
Case 0
WriteByte(wert)
Case 1
WriteWord(wert)
Case 2
WriteLong(wert)
EndSelect
CloseFile(2)
EndIf
EndProcedure
Procedure ReadFromFile()
pos=Val(GetGadgetText(#ggt_stelle))
If ReadFile(1,datei1)
If ReadFile(2,datei2)
Select GetGadgetState(#ggt_art)
Case 0
UseFile(1)
FileSeek(pos)
d1=ReadByte()
UseFile(2)
FileSeek(pos)
d2=ReadByte()
Case 1
UseFile(1)
FileSeek(pos)
d1=ReadWord()
UseFile(2)
FileSeek(pos)
d2=ReadWord()
Case 2
UseFile(1)
FileSeek(pos)
d1=ReadLong()
UseFile(2)
FileSeek(pos)
d2=ReadLong()
EndSelect
SetGadgetText(#ggt_wert1,Str(d1))
SetGadgetText(#ggt_wert2,Str(d2))
CloseFile(2)
EndIf
CloseFile(1)
EndIf
EndProcedure
Procedure UpdateHeaderList()
ClearGadgetItemList(#ggt_header)
stelle=0
bytestelle=0
ForEach Header()
AddGadgetItem(#ggt_header,-1,Str(stelle)+Chr(10)+Str(bytestelle)+Chr(10)+Chr(10)+Chr(10)+Header()\typ+Chr(10)+Header()\info)
INC stelle
bytestelle=bytestelle+Header()\tbytes
Next
SetGadgetState(#ggt_header,stelle-1)
EndProcedure
Procedure AddHeaderItem()
SelectElement(Header(),GetGadgetState(#ggt_header)+1)
AddElement(Header())
Header()\info=GetGadgetText(#ggt_header_info)
Header()\typ=GetGadgetText(#ggt_header_combo)
Select Header()\typ
Case "Byte"
Header()\tbytes=1
Case "Word"
Header()\tbytes=2
Case "Long"
Header()\tbytes=4
EndSelect
UpdateHeaderList()
EndProcedure
Procedure SaveHeader()
name.s=SaveFileRequester("Speichern der HeaderListe",name,"HeaderDatei|*.hd*",0)
If name
If LCase(GetExtensionPart(name))<>".hd"
name=name+".hd"
EndIf
If CreateFile(1,name)
ForEach Header()
WriteStringN(Header()\typ)
WriteStringN(Header()\info)
WriteByte(Header()\tbytes)
Next
CloseFile(1)
EndIf
EndIf
EndProcedure
Procedure LoadHeader()
name.s=OpenFileRequester("Laden der HeaderListe",name,"HeaderDatei|*.hd*",0)
If name
If ReadFile(1,name)
ClearList(Header())
While Loc()<Lof()
AddElement(Header())
Header()\typ=ReadString()
Header()\info=ReadString()
Header()\tbytes=ReadByte()
Wend
CloseFile(1)
UpdateHeaderList()
EndIf
EndIf
EndProcedure
If OpenWindow(1,100,100,600,580,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"Dateivergleicher")
CreateGadgetList(WindowID())
PanelGadget(#ggt_panel,0,0,600,350)
AddGadgetItem(#ggt_panel,0,"Bytes")
ListIconGadget(#ggt_bytes,10,10,580,280,"Stelle",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#ggt_bytes,1,"Datei 1",180)
AddGadgetColumn(#ggt_bytes,2,"Datei 2",180)
AddGadgetItem(#ggt_panel,1,"Words")
ListIconGadget(#ggt_words,10,10,580,280,"Stelle",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#ggt_words,1,"Datei 1",180)
AddGadgetColumn(#ggt_words,2,"Datei 2",180)
AddGadgetItem(#ggt_panel,2,"Longs")
ListIconGadget(#ggt_longs,10,10,580,280,"Stelle",200,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#ggt_longs,1,"Datei 1",180)
AddGadgetColumn(#ggt_longs,2,"Datei 2",180)
AddGadgetItem(#ggt_panel,3,"Verschiedenes")
ListIconGadget(#ggt_daten,10,10,580,280,"Datei",100 ,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#ggt_daten,1,"Dateigröße",200)
AddGadgetItem(#ggt_panel,4,"DateiHeader")
ListIconGadget(#ggt_header,10,10,580,270,"ParamNR",100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#ggt_header,1,"Stelle",100)
AddGadgetColumn(#ggt_header,2,"Datei1",100)
AddGadgetColumn(#ggt_header,3,"Datei2",100)
AddGadgetColumn(#ggt_header,4,"Typ",100)
AddGadgetColumn(#ggt_header,5,"Info",100)
TextGadget(#PB_Any,10,290,40,20,"Typ:")
ComboBoxGadget(#ggt_header_combo,50,290,100,200)
AddGadgetItem(#ggt_header_combo,0,"Byte")
AddGadgetItem(#ggt_header_combo,1,"Word")
AddGadgetItem(#ggt_header_combo,2,"Long")
TextGadget(#PB_Any,170,290,60,20,"Info:")
StringGadget(#ggt_header_info,200,290,100,20,"")
ButtonGadget(#ggt_header_add,360,290,100,20,"Hinzufügen")
ButtonGadget(#ggt_header_delete,480,290,100,20,"Löschen")
CloseGadgetList()
CheckBoxGadget(#ggt_header_only,10,380,220,20,"Nur Dateiheader auslesen: Länge in Bytes:")
StringGadget(#ggt_header_length,230,380,60,20,"0",#PB_String_Numeric|#PB_Text_Right)
CheckBoxGadget(#ggt_compare_intelligent,10,420,200,20,"Intelligente Analyse")
ButtonGadget(#ggt_compare,10,450,200,30,"Dateien jetzt vergleichen")
Frame3DGadget(#PB_Any,300,360,290,120,"Werte Schreiben")
TextGadget(#PB_Any,320,380,60,20,"Datei 1")
StringGadget(#ggt_wert1,310,395,60,20,"")
TextGadget(#PB_Any,390,380,60,20,"Datei 2")
StringGadget(#ggt_wert2,380,395,60,20,"")
ButtonGadget(#ggt_schreibe_1,320,420,60,20,"Schreiben")
ButtonGadget(#ggt_schreibe_2,380,420,60,20,"Schreiben")
TextGadget(#PB_Any,460,390,60,20,"Art:")
ComboBoxGadget(#ggt_art,520,390,60,200)
AddGadgetItem(#ggt_art,0,"Byte")
AddGadgetItem(#ggt_art,1,"Word")
AddGadgetItem(#ggt_art,2,"Long")
TextGadget(#PB_Any,460,410,60,20,"Stelle:")
StringGadget(#ggt_stelle,520,410,60,20,"")
ButtonGadget(#ggt_lese,480,440,100,20,"Lesen")
TextGadget(#PB_Any,10,500,80,20,"Datei1:")
TextGadget(#PB_Any,10,540,80,20,"Datei1:")
TextGadget(#ggt_datei1,90,500,500,40,"")
TextGadget(#ggt_datei2,90,540,500,40,"")
CreateMenu(1,WindowID())
MenuTitle("Datei")
MenuItem(#menu_laden_1,"Datei 1")
MenuItem(#menu_laden_2,"Datei 2")
MenuBar()
MenuItem(#menu_ende,"Beenden")
MenuTitle("Header")
MenuItem(#menu_header_laden,"DateiHeaderliste laden")
MenuItem(#menu_header_speichern,"DateiHeaderliste speichern")
MenuTitle("Info")
MenuItem(#menu_info,"Info")
Repeat
event=WaitWindowEvent()
If event=#PB_EventGadget
Select EventGadgetID()
Case #ggt_compare
If GetGadgetState(#ggt_compare_intelligent)=1
ReadDataFromFile_Intelligent()
Else
ReadDataFromFile()
EndIf
Case #ggt_schreibe_1
WriteInFile_1()
Case #ggt_schreibe_2
WriteInFile_2()
Case #ggt_lese
ReadFromFile()
Case #ggt_header_add
AddHeaderItem()
Case #ggt_header_delete
SelectElement(Header(),GetGadgetState(#ggt_header))
DeleteElement(Header())
UpdateHeaderList()
EndSelect
ElseIf event=#PB_EventMenu
Select EventMenuID()
Case #menu_laden_1
dn.s=OpenFileRequester("Datei 1 wählen",GetPathPart(datei1),"All|*.*",0)
If dn
datei1=dn
SetGadgetText(#ggt_datei1,datei1)
EndIf
Case #menu_laden_2
dn.s=OpenFileRequester("Datei 2 wählen",GetPathPart(datei2),"All|*.*",0)
If dn
datei2=dn
SetGadgetText(#ggt_datei2,datei2)
EndIf
Case #menu_ende
quit=1
Case #menu_header_laden
LoadHeader()
Case #menu_header_speichern
SaveHeader()
Case #menu_info
MessageRequester("Info","Dateivergleicher wurde geschrieben von Franky")
EndSelect
ElseIf event=#PB_EventCloseWindow
quit=1
EndIf
Until quit=1
CloseWindow(1)
EndIf