Seite 1 von 1

Create DataSection from File

Verfasst: 19.12.2015 22:45
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

Re: AW: Create DataSection from File

Verfasst: 20.12.2015 01:13
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.

Re: Create DataSection from File

Verfasst: 20.12.2015 01:24
von ts-soft
zBin ist doch etwas anders, Bin2Data wäre ähnlich (http://www.purebasic.fr/english/viewtop ... 83#p374183).

Re: Create DataSection from File

Verfasst: 20.12.2015 12:59
von RSBasic
@GPI
Danke fürs Teilen. :allright:

Re: AW: Create DataSection from File

Verfasst: 20.12.2015 19:55
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.

Re: Create DataSection from File

Verfasst: 20.12.2015 21:33
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.