Create DataSection from File

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Create DataSection from File

Beitrag von GPI »

Ich hab eine einfache Möglichkeit gefunden, wie man bei Beispiele externe Daten (bspw. Bilder) in den Quellcode einbinden kann. Das erhöht doch die Übersicht in CodeArchiv, wenn die Beispiele so eingebunden werden.

einfach eine Datei auswählen und es wird automatisch eine .pbi in gleichen Verzeichnis/name erstellt, die die Daten enthalten.
Wenn mehrere Dateien ausgewählt werden, wird nur eine .pbi erstellt, die alle Dateien beinhaltet.

Code: Alles auswählen

;    Description: Create an DataSection.pbi from a binary file. Multifileselect supported
;         Author: GPI
;           Date: 19-12-2015
;     PB-Version: 5.40
;             OS: Windows, Linux, Mac
;  English-Forum: 
;   French-Forum: 
;   German-Forum: 
; -----------------------------------------------------------------------------

EnableExplicit

Procedure.s Simple_Name(a$)
  Protected i
  Protected b$="Data_"
  Protected char
  
  For i=1 To Len(a$)
    char=Asc(Mid(a$,i,1))
    Select char
      Case 'a' To 'z','A' To 'Z', '0' To '9'
        b$+Chr(char)
      Default 
        b$+"_"
    EndSelect
    
    
  Next
  ProcedureReturn b$
EndProcedure
Procedure WriteMem(out,file.s,*mem,len)
  Protected a$,b$
  Protected i
  Protected limit=80
  file=simple_name(GetFilePart(file))
  
  WriteStringN(out,file+"_len:")
  WriteStringN(out,"data.i "+Str(len))
  WriteString(out,file+":")
  For i=0 To len-1 Step 8
    If limit>=80
      WriteStringN(out,"")
      WriteString(out, "Data.q ")
      limit=7
    Else
      WriteString(out,",")
      limit+1
    EndIf
    a$="$"+Hex(PeekQ(*mem+i)) 
    b$=Str(PeekQ(*mem+i))
    If Len(a$)<Len(b$)
      WriteString(out,a$)
      limit+Len(a$)
    Else
      WriteString(out,b$)
      limit+Len(b$)
    EndIf    
  Next
  WriteStringN(out,"")
EndProcedure

Define a$
Define file$
Define len
Define *mem
Define in
Define out

file$=GetCurrentDirectory()
Repeat
  file$=OpenFileRequester("Create Data pbi",file$,"*.*|*.*",1,#PB_Requester_MultiSelection)
  If file$="" 
    Break
  EndIf
  
  out=CreateFile(#PB_Any,file$+".pbi")      
  If out
    WriteStringN(out,"DataSection")
    Repeat
      len=FileSize(file$)
      If len>0
        *mem=AllocateMemory(len+8)
        If *mem
          in=ReadFile(#PB_Any,file$)
          If in
            ReadData(in,*mem,len)
            CloseFile(in)
          Else
            Debug "Error Read in"
          EndIf
          writemem(out,file$,*mem,len)
          WriteStringN(out,"")
          
          FreeMemory(*mem)
          *mem=0
        EndIf
      EndIf
      a$=NextSelectedFileName()
      If a$=""
        Break
      EndIf
      file$=a$
    ForEver
    
    WriteStringN(out,"EndDataSection")
    CloseFile(out)
  EndIf
  
  
ForEver
Das Ergebnis würde bspw. so aussehen:

Code: Alles auswählen

DataSection
Data_1_ico_len:
Data.i 1150
Data_1_ico:
Data.q $1010000100010000,$468002000010000,$28000000160000,$20000000100000,$2000010000
Data.q 71303168,0,0,0,0,$20001020000,$1050000010400,$204040000000500,256,0,0,0,$1070001040000
Data.q $290000001700,$3A0000003400,$330000003A00,$307130001032600,1280,0,$813000000000000
Data.q $230000000502,$204830000005700,$60DA30108109900,$95000103A101,$4D0000007C00
Data.q $20309161A00,0,$E1F000000000000,$711350000000805,$67C6D90E37758502,$79DEFC2A7CE1F61F
Data.q $2758F21B5BB5FC28,$71000205CB0A,$40610242800,0,$2247000000000000,$52B73B050F1F040E
Data.q $9DF9FD4081EFE31B,$A8FBFE6FA9FBFE60,$76E9FE5997F7FE6D,$60CC3113D8CFD34,$20F254D1E02
Data.q 0,$3B7C000000000000,$7AE1C31548A20417,$ADFCFE70A1F7FD41,$B0FCFE83B0FCFE81
Data.q $97F2FE7EABFBFE83,$3C89FD2E69D2FE65,33809,0,$3E90000000000000,$86E0FC1E54B64911
Data.q $9BF2FE6A98EDFE54,$9CF4FE6C9CF4FE6B,$95E9FE6B9AF0FE6C,$43A0FE4075D6FE67,$1116418EF011
Data.q 0,$3686000000000000,$72D3FE1A50B18E0B,$7DE1FE457BDCFE3D,$7DE2FE467EE3FE46
Data.q $79D9FE467CDFFE46,$419BFE3167CAFE45,$4A0E3885FD0F,0,$2F77000000000000,$5ABFFE1044A2A208
Data.q $61CDFE255FC8FE22,$62CFFE2662D0FE25,$5EC5FE2661CCFE26,$3A8FFE1B53B7FE25,$5F0F357CFD0B
Data.q 0,$3277000000000000,$69B9FD1C4797890D,$6DC6FE3D6CC1FE3C,$6EC7FE3D6EC8FE3E
Data.q $6BBFFE3E6DC4FE3E,$3380FE3663B2FE3D,$4612367AFC0A,0,$3678000000000000,$82BBFC2447874013
Data.q $86C7FE6385C3FE62,$87C8FE6387C8FE63,$84C1FE6486C6FE64,$2C6DFE5A79B2FE63,$D1D4185EB09
Data.q 0,$498A000000000000,$84B1B41434710226,$9AC9FE8098C5FD6C,$9ACAFE819ACBFE81
Data.q $97C2FE8199C8FE81,$346FFC4C6799FE80,29461,0,0,$3F7514314F880000,$A4C7FD7589B1C522
Data.q $A6CAFE93A6CAFE91,$79A3FE90A2C5FE93,$5B92941E3B72FB64,573,0,0,$6597000000000000
Data.q $4D7F6C264378084B,$5F8DEE4A628FC732,$5184B42F497CE848,$1536C9D4B36,0,0,0,0
Data.q $729F000000000000,$6E9B03506895015B,599,0,0,0,0,0,0,0,0,0,0,$1FF8000000000000
Data.q $3C0000007E00000,$3C0000003C00000,$3C0000007C00000,$3C0000003C00000,$3C0000003C00000
Data.q $7E0000007C00000,$7FFC00000FF00000,$FFFF0000

EndDataSection
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: AW: Create DataSection from File

Beitrag von Kurzer »

Feine Sache, GPI. Aber gibts da nicht schon sowas von ts-soft?

zbin oder so ähnlich? Ich kann es gerade nicht prüfen.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Create DataSection from File

Beitrag von ts-soft »

zBin ist doch etwas anders, Bin2Data wäre ähnlich (http://www.purebasic.fr/english/viewtop ... 83#p374183).
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Create DataSection from File

Beitrag von RSBasic »

@GPI
Danke fürs Teilen. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: AW: Create DataSection from File

Beitrag von Kurzer »

ts-soft hat geschrieben:zBin ist doch etwas anders, Bin2Data wäre ähnlich (http://www.purebasic.fr/english/viewtop ... 83#p374183).
ja genau, bin2data meine ich eigentlich auch.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Create DataSection from File

Beitrag von GPI »

Ach mei, öfters was neues :) Wobei mir persönlich den Quellcode da nicht gefällt, weil Assembler benutzt wird und ich dann nichts erweitern kann. Das Programm ist für mich ein typisches Beispiel, wo Geschwindigkeit nicht wichtig ist.

Mein Code hat hier auch eine Besonderheit - es schaut nach was kleiner ist - die Dezimalzahl oder die Hexzahl. Genauso hab ich keinen festen Zeilenumbruch, sondern erst, wenn die 80 Zeichengrenze überschritten ist. Deshalb kommt bei
mir auch folgendes vor:

Code: Alles auswählen

Data.q $729F000000000000,$6E9B03506895015B,599,0,0,0,0,0,0,0,0,0,0,$1FF8000000000000
sieht zwar nicht so schön geordnet aus, dafür sinds aber weniger Zeilen - und direkt daran rumändern will ich eh nicht.
Und achja: Ich runde auf ganze Quads auf :) - deshalb gibt es auch das Integer-Data mit der Länge.

Ich brauchte halt etwas, um möglichst einfach externe Dateien anzubinden.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten