Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Binarys mit vbs lesen und schreiben

Frage Entwicklung VB for Applications

Mitglied: aFankhauser

aFankhauser (Level 1) - Jetzt verbinden

20.11.2009, aktualisiert 26.11.2009, 5326 Aufrufe, 20 Kommentare

(genauer gehts um ne HTA)

ich möchte eigentlich eine Datei (.ico) in mein script einbetten. Nun habe ich aber das problem, dass all meine Versuche daran scheitern, dass die NULen nicht eingelesen bzw. geschrieben werden.

habe auch einmal versucht den ganzen Quelltext als String einzubetten. Funktioniert zwar soweit. Aber in der Ausgabe fehlen natürlich wieder die NULen

hier noch der betroffene Ausschnitt aus Meinem Script
01.
pfad1 = "C:\meinPfad\main.ico" 
02.
set d = fso.opentextfile(pfad1, 2, 1) 
03.
d.write ""  '<-- Was soll ich hier blos machen? 
04.
d.close 
05.
set d = Nothing
Habs auch schon mit einlesen und direkt schreiben versucht --> wieder negativ

ist sowas überhaupt möglich?
Oder könnte man diese Dateien auch irgendwie "binär" öffnen?
Mitglied: 76109
21.11.2009 um 11:33 Uhr
Hallo aFrankhauser!

Wenn Du mit FileSystemObject Binary-Dateien lesen und schreiben willst, dann müssen die Zeichen einzeln gelesen und geschrieben werden.

Beispiel Ico-Datei Binary einlesen und wieder Schreiben (Test.Bin), zusätzlich Hex-Dump schreiben (Test.Txt) in etwa so:
01.
Const IcoPath = "X:\Test\Test.Ico" 
02.
Const BinPath = "X:\Test\Test.Bin" 
03.
Const HexPath = "X:\Test\Test.Txt" 
04.
 
05.
Dim Fso, IcoFile, BinFile, HexFile, BinText, HexText, c, h, i 
06.
     
07.
Set Fso = CreateObject("Scripting.FileSystemObject") 
08.
 
09.
Set IcoFile = Fso.OpenTextFile(IcoPath) 
10.
     
11.
i = 0 
12.
     
13.
Do Until IcoFile.AtEndOfStream 
14.
    c = IcoFile.Read(1):  BinText = BinText & c 
15.
    h = Right("0" & Hex(Asc(c)), 2):  HexText = HexText & h & " " 
16.
    i = i + 1 
17.
    If i = 16 Then i = 0:  HexText = HexText & vbCrLf 
18.
Loop 
19.
     
20.
IcoFile.Close 
21.
     
22.
Set BinFile = Fso.CreateTextFile(BinPath) 
23.
     
24.
For i = 1 To Len(BinText) 
25.
    BinFile.Write Mid(BinText, i, 1) 
26.
Next 
27.
     
28.
BinFile.Close 
29.
     
30.
Set HexFile = Fso.CreateTextFile(HexPath) 
31.
     
32.
HexFile.Write HexText 
33.
     
34.
HexFile.Close
Gruß Dieter
Bitte warten ..
Mitglied: bastla
21.11.2009 um 12:20 Uhr
@76109
Ich bevorzuge zwar das Einlesen am Stück - also etwa
01.
BinText = IcoFile.ReadAll 
02.
For j = 1 To Len(BinText) 
03.
    h = Right("0" & Hex(Asc(Mid(BinText, j, 1))), 2):  HexText = HexText & h & " " 
04.
    i = i + 1 
05.
    If i = 16 Then i = 0:  HexText = HexText & vbCrLf 
06.
Next
aber speziell bei Dateien in der Größe eines .ico-Files wird das wohl kaum einen größeren Unterschied machen ...

[Edit] Wohl doch - die Hex-Umwandlung erfolgt allerdings noch korrekt - strange ...

Bei Deiner Einlese-Variante sollte es aber zumindest im Gegenzug möglich sein, das Schreiben ohne Schleife abzuwickeln:
BinFile.Write BinText
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: 76109
21.11.2009 um 14:00 Uhr
Hallo bastla!

Die Hex-Konvertierung stimmt beim Gesamt-Einlesen auch nicht mehr mit der Binary-Datei überein.

Und beim Schreiben am Stück funktioniert es auch nicht

Gruß Dieter
Bitte warten ..
Mitglied: bastla
21.11.2009 um 14:55 Uhr
@76109
Die Hex-Konvertierung stimmt beim Gesamt-Einlesen auch nicht mehr mit der Binary-Datei überein.
Na dann bin ich ja wieder beruhigt ...

Das Bearbeiten von Daten mit einem Werkzeug, das nicht dafür gedacht ist, auch noch zwischen Tür und Angel erledigen zu wollen (wie es leider bei meinem Versuch oben der Fall war), ist definitv keine gute Idee - insofern meinen Kommentar bitte wohlwollend zu ignorieren ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
21.11.2009 um 15:08 Uhr
Hallo bastla!

Naja, ich hatte es ja vorher nach Deiner Methode auch probiert und nach der Verunsicherung durch Dich dann halt nochmal probiert

Das FileSystemObject ist eben nur für Text-Dateien gedacht.

Gruß Dieter
Bitte warten ..
Mitglied: aFankhauser
22.11.2009 um 15:47 Uhr
@ 76109:

Habe zum testen mal die Pfade angepasst.
ich staunte nicht schlecht als das alles schon beim ersten Versuch klappte.

Ich versuch jetzt mal die Funktion in mein Script einzubauen und dessen Funktionsweise zu verstehen.

Dank dir für die schnelle - und erst noch äusserst hilfreiche - Antwort
Bitte warten ..
Mitglied: 76109
22.11.2009 um 19:58 Uhr
Hallo aFrankhauser!

Zitat von aFankhauser:
ich staunte nicht schlecht als das alles schon beim ersten Versuch klappte.
Wow, dann hast es wohl geschafft, die Pfade gleich beim 1. Versuch richtig anzugeben

Ich versuch jetzt mal die Funktion in mein Script einzubauen und dessen Funktionsweise zu verstehen.
Falls Du noch Fragen hast? Kein Problem

Gruß Dieter
Bitte warten ..
Mitglied: aFankhauser
22.11.2009 um 23:36 Uhr
Hab das script nun meinen bedürfnissen angepasst. Und habe noch zwei drei Dinge umgebaut. Das Ganze arbeitet nun wie folgt:
script 1:
01.
Set Fso = CreateObject("Scripting.FileSystemObject") 
02.
titel = fso.getBaseName(wscript.scriptname) 
03.
input = "C:\mein Pfad\main.ico" 
04.
output = "C:\mein Pfad\temporär Ascii von main.ico.txt" 
05.
 
06.
'nur zur Sicherheit 
07.
if Not MsgBox("Wirklich ausführen?" & vbLf & "Dateien werden eventuell überschrieben!",32+1,titel)=vbOK Then wscript.quit 
08.
 
09.
'jetzt gehts los 
10.
set oD1 = fso.openTextFile(input, 1) 
11.
set oD2 = fso.openTextFile(output, 2, 1) 
12.
 
13.
Do Until oD1.atEndOfStream 
14.
 a1 = oD1.read(1) 
15.
 a2 = Asc(a1) 
16.
 oD2.write Right("00" & a2, 3) 
17.
loop 
18.
 
19.
MsgBox "Fertig",,titel 
20.
 
dies ist das vorbereitungsScript. Es schreibt mir die ascii werte aller Zeichen (immer 3-Stellig) direkt aneinander in eine neue Datei.

Dann kann ich den ganzen dateiQuelltext Kopieren, und als String in meinem 2ten Script einfügen.
Script 2 (codeSchnipsel):
01.
'hier den code an "ascCode" zuweisen (Beispiel) 
02.
ascCode = "077097120"  '77 97 120 -->Max 
03.
Const IcoTargetPath = "C:\mein zielPfad\main.ico" 
04.
 
05.
Set BinFile = Fso.CreateTextFile(IcoTargetPath) 
06.
 
07.
For i = 1 To Len(ascCode) step 3 
08.
 a = Mid(ascCode, i, 3) 
09.
 BinFile.Write chr(a) 
10.
Next 
11.
 
12.
BinFile.Close 
13.
set BinFile = Nothing 
14.
 
script 2 liest dann immer 3 Zeichen, und schreibt immer dessen Charakter (Chr()) in die Zieldatei.
So funktionierts wie ich es mir vorgestellt habe.

nun habe ich aber doch noch bedenken...
Was nun wenn ich einmal eine Datei, die zB 10GB gross ist verarbeiten möchte.
werden sooo lange Strings überhaupt gespeichert?
gibt es da eine "obergrenze"?
Bitte warten ..
Mitglied: 76109
23.11.2009 um 10:32 Uhr
Hallo aFrankhauser!

Du kannst ja direkt lesen und schreiben und musst nicht mit Strings arbeiten. Diese Methode ist aber auch nur in einem angemessenem Rahmen 10-50 KB gerade noch zu gebrauchen. Bei größeren Dateien kannst Du das vergessen und musst andere Möglichkeiten in Betracht ziehen. Temporäre Batch, sowas in der Art. Eventuell fällt bastla etwas dazu ein

BinToAscii:
01.
    Set oD1 = Fso.OpenTextFile(IcoPath) 
02.
    Set oD2 = Fso.CreateTextFile(TxtPath) 
03.
     
04.
    Do Until oD1.AtEndOfStream 
05.
        oD2.Write Right("00" & Asc(oD1.Read(1)), 3) 
06.
    Loop 
07.
     
08.
    oD1.Close:  oD2.Close
AsciiToBin:
01.
    Set oD2 = Fso.OpenTextFile(TxtPath) 
02.
    Set oD3 = Fso.CreateTextFile(BinPath) 
03.
     
04.
    Do Until oD2.AtEndOfStream 
05.
        oD3.Write Chr(CInt(oD2.Read(3))) 
06.
    Loop 
07.
     
08.
    oD2.Close:  oD3.Close
Gruß Dieter
Bitte warten ..
Mitglied: aFankhauser
23.11.2009 um 17:52 Uhr
Stimmt eigentlich schon.
Mein Ziel ist es aber, ein Installationsprogramm zu schreiben, welches als einzelne Datei funktioniert. (also nicht wie zb auf einer CD, sondern eher wie ein Installer-Paket.)
Aus diesem Grund muss ich alle dateien "includen". (Darum die ZeichenKette)

Als Fan von Freeware, möchte ich Freeware online zur verfügung stellen.
(zwar nur Scripte und eben nicht immer so sinnvolle)

hier noch der Link dorthin: http://www.hiddenalpha.ch/index.php > Downloads (ganz unten in der Navi-Leiste)
Das entsprechende Script wäre dann: Speed-Rechner version 0.2.12
Bitte warten ..
Mitglied: 76109
23.11.2009 um 19:12 Uhr
Hallo aFrankhauser!

Also, ich habe Deinen Speedrechner mal getestet und leider festgestellt, dass die Umrechnung nicht stimmt.

Gegeben:
100 Meter
12 Sekunden

Ergebnis = 300 Km/h -- Sollte sein 30 Km/h (Kopfrechnung)

Gruß Dieter
Bitte warten ..
Mitglied: aFankhauser
23.11.2009 um 20:30 Uhr
Zitat von 76109:
Also, ich habe Deinen Speedrechner mal getestet und leider
festgestellt, dass die Umrechnung nicht stimmt.

???????????????????????
versteh ich jetzt nicht. bei mir rechnet er das richtig.
hast du geprüft ob du wirkich keinen Tippfehler drinnhast
(zB. 1000 anstatt 100)
sonst kann ich mir das nicht erklären???
Bitte warten ..
Mitglied: 76109
23.11.2009 um 22:19 Uhr
Hallo aFrankhauser!

Also, ich habe es jetzt noch mal eingegeben und er zeigt mir immer noch das gleiche Ergebnis. Allerdings habe ich nur den Online-Rechner getestet.

Gegeben: 100 Meter in 12 Sekunden

Bei m/s = 8,333 stimmt
Bei Km/s = 8,333 stimmt nicht
Bei Km/h = 300 stimt nicht

Gruß Dieter
Bitte warten ..
Mitglied: 76109
24.11.2009 um 09:08 Uhr
Hallo aFrankhauser!

Wäre eventuell noch zu überlegen, ob Du anstatt dem 3-stelligen Ascii-Format nicht lieber das 2-stellige Hex-Ascii-Format verwendest. Das spart immerhin 1/3 an Dateigröße.

BinToHexAscii
01.
    Set oD1 = Fso.OpenTextFile(IcoPath) 
02.
    Set oD2 = Fso.CreateTextFile(TxtPath) 
03.
     
04.
    Do Until oD1.atEndOfStream 
05.
        oD2.Write Right("0" & Hex(Asc(oD1.Read(1))), 2) 
06.
    Loop 
07.
     
08.
    oD1.Close:  oD2.Close
HexAsciiToBin
01.
    Set oD2 = Fso.OpenTextFile(TxtPath) 
02.
    Set oD3 = Fso.CreateTextFile(BinPath) 
03.
     
04.
    Do Until oD2.atEndOfStream 
05.
        oD3.Write Chr(CInt("&H" & oD2.Read(2))) 
06.
    Loop 
07.
     
08.
    oD2.Close:  oD3.Close
Gruß Dieter
Bitte warten ..
Mitglied: aFankhauser
24.11.2009 um 19:35 Uhr
aaha! Da wird mir einiges klar. --> Online
habe auch den mal schnell aktualisiert. Er sollte jetzt stimmen.

Danke für den Hinweis.
Bitte warten ..
Mitglied: 76109
24.11.2009 um 20:00 Uhr
Hallo aFrankhauser!

Yep, dass funktioniert jetzt

Sorry, habe leider einen neuen Fehler gefunden (Online)

Gegeben: 50 m und 6 Sek = 30 Km/h stimmt
Gegeben: 50 m und 5,6 Sek = 3,21.. Km/h stimmt nicht

Gruß Dieter
Bitte warten ..
Mitglied: aFankhauser
24.11.2009 um 23:50 Uhr
???
seh ich jetzt nicht. Bei mir funktionierts wie es sollte (zumindest dein Beispiel)
Bitte warten ..
Mitglied: 76109
25.11.2009 um 05:42 Uhr
Ich will ja nicht nerven, aber bisher keine Veränderung (Online).

50m in 5,6 sekunden sind immer noch 3,2142... Km/h anstatt 32,142... Km/h
Bitte warten ..
Mitglied: aFankhauser
26.11.2009 um 17:50 Uhr
versteh ich immer noch nicht.
wo sollte denn der Fehler versteckt sein? hier mal Code mit Kommentare. vielleicht findest du ja was.

der betroffene ScriptTeil:
(wäre VbScript)
01.
Sub geschw_Click 
02.
 vS = Replace(document.all.distanz.value,",",".") 'Komma mit Punkt ersetzen 
03.
 vT = Replace(document.all.zeit.value,",",".") 'Komma mit Punkt ersetzen 
04.
 
05.
 vSType = document.all.distanzType.value    'Einheit der Strecke 
06.
 vTType = document.all.zeitType.value    'Einheit der Zeit 
07.
 vVSType = document.all.geschwType1.value    'StreckenEinheit der Geschwindigkeit 
08.
 vVTType = document.all.geschwType2.value    'ZeitEinheit der Geschwindigkeit 
09.
 
10.
'überprüfung 
11.
 if vS = "" Then MsgBox "Keine Distanz angegeben",48,"Fehler" : document.all.distanz.select() : Exit Sub 
12.
 if vT = "" Then MsgBox "Keine Zeit angegeben",48,"Fehler" : document.all.zeit.select() : Exit Sub 
13.
 if Not IsNumeric(vS) Then MsgBox """" & vS & """ ist keine gültige Zahl",48,"Fehler" : document.all.distanz.select() : Exit Sub 
14.
 if Not IsNumeric(vT) Then MsgBox """" & vT & """ ist keine gültige Zahl",48,"Fehler" : document.all.zeit.select() : Exit Sub 
15.
 
16.
'ausrechnung 
17.
 vS = (vS * vSType)    'Strecke in [Meter] umrechnen 
18.
 vT = (vT * vTType)   'Zeit in [Sekunden] umrechnen 
19.
 vV = (vS / vT)    'Geschw. in [Meter pro Sekunde] rechnen 
20.
 vV = (vV / vVSType)    'Geschw. in [Strecke pro Sekunde] umrechnen 
21.
 vV = (vV * vVTType)    'Geschw. in [Strecke pro Zeit] umrechnen 
22.
 document.all.geschw.value = vV    'Ergebnis ausgeben 
23.
End Sub
und hier der Body:
01.
<table> 
02.
 <tr> 
03.
  <td> 
04.
   <a href="#" onclick="vbscript:distanz_Click">Distanz:</a> 
05.
  </td> 
06.
  <td> 
07.
   <input name="distanz" type="text" tabindex="04" maxlength="6" width="7"> 
08.
  </td> 
09.
  <td> 
10.
   <select name="distanzType" tabindex="05"> 
11.
    <option value="0.001">Millimeter</option> 
12.
    <option value="0.01">Zentimeter</option> 
13.
    <option value="0.1">Dezimeter</option> 
14.
    <option value="1" selected>Meter</option> 
15.
    <option value="1000">Kilometer</option> 
16.
    <option value="299797000">Lichtsekunden</option> 
17.
    <option value="17987820000">Lichtminuten</option> 
18.
    <option value="1079269200000">Lichtstunden</option> 
19.
    <option value="9460873807200000">Lichtjahre</option> 
20.
   </select> 
21.
  </td></tr> 
22.
 <tr> 
23.
  <td> 
24.
   <a href="#" onclick="vbscript:zeit_Click">Zeit:</a> 
25.
  </td><td> 
26.
   <input type="text" name="zeit" width="7" maxlength="6" tabindex="06"> 
27.
  </td><td> 
28.
   <select name="zeitType" tabindex="07"> 
29.
    <option value="1">Sekunden</option> 
30.
    <option value="60">Minuten</option> 
31.
    <option value="3600">Stunden</option> 
32.
    <option value="43200">Tage (12h)</option> 
33.
    <option value="86400">Tage (24h)</option> 
34.
    <option value="31557600">Jahre</option> 
35.
   </select> 
36.
  </td></tr><tr><td> 
37.
   <a href="#" onclick="vbscript:geschw_Click">Geschwindigkeit:</a> 
38.
  </td><td> 
39.
   <input type="text" name="geschw" value="" maxlength="16" tabindex="09"> 
40.
  </td><td> 
41.
   <select name="geschwType1" tabindex="10"> 
42.
    <option value="0.001">mm</option> 
43.
    <option value="0.01">cm</option> 
44.
    <option value="0.1">dm</option> 
45.
    <option value="1">m</option> 
46.
    <option value="1000" selected>km</option> 
47.
    <option value="299797000">Ls</option> 
48.
    <option value="17987820000">Lmin</option> 
49.
    <option value="1079269200000">Lh</option> 
50.
    <option value="9460873807200000">Lj</option> 
51.
   </select> / 
52.
   <select name="geschwType2" tabindex="10"> 
53.
    <option value="1">s</option> 
54.
    <option value="60">min</option> 
55.
    <option value="3600" selected>h</option> 
56.
    <option value="43200">Tag (12h)</option> 
57.
    <option value="86400">Tag (24h)</option> 
58.
    <option value="31557600">Jahr</option> 
59.
   </select> 
60.
  </td> 
61.
 </tr> 
62.
</table>
die Zahlen, welche in den value stehen, sind die UmrechnungsFaktoren.
zB:
1km = 1000m
1h = 3600s
usw.
Bitte warten ..
Mitglied: 76109
26.11.2009 um 19:50 Uhr
Hallo aFrankhauser!

Der Fehler liegt im VB-Script in Zeile 2 und 3

Zahl: Variable = 5.6
Text: Variable = "5,6" Bei Konvertierung in "5.6" wird daraus 56

Die Punkt-Konvertierung braucht man nur bei englischen Zahlenwerten, weil die anstatt wie wir 5,6 den Wert 5.6 schreiben.

Eine entsprechende Konvertierung in Komma, kannst Du machen, wenn Du auch die Schreibform mit Punkt zulassen willst.

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(5)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Teilstring nach Splitten in Variablen schreiben vbs (2)

Frage von goodbytes zum Thema Batch & Shell ...

VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (17)

Frage von Unwichtig zum Thema Netzwerkmanagement ...