Binarys mit vbs lesen und schreiben
(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
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?
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
pfad1 = "C:\meinPfad\main.ico"
set d = fso.opentextfile(pfad1, 2, 1)
d.write "" '<-- Was soll ich hier blos machen?
d.close
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?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 129914
Url: https://administrator.de/forum/binarys-mit-vbs-lesen-und-schreiben-129914.html
Ausgedruckt am: 25.12.2024 um 19:12 Uhr
20 Kommentare
Neuester Kommentar
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:
Gruß Dieter
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:
Const IcoPath = "X:\Test\Test.Ico"
Const BinPath = "X:\Test\Test.Bin"
Const HexPath = "X:\Test\Test.Txt"
Dim Fso, IcoFile, BinFile, HexFile, BinText, HexText, c, h, i
Set Fso = CreateObject("Scripting.FileSystemObject")
Set IcoFile = Fso.OpenTextFile(IcoPath)
i = 0
Do Until IcoFile.AtEndOfStream
c = IcoFile.Read(1): BinText = BinText & c
h = Right("0" & Hex(Asc(c)), 2): HexText = HexText & h & " "
i = i + 1
If i = 16 Then i = 0: HexText = HexText & vbCrLf
Loop
IcoFile.Close
Set BinFile = Fso.CreateTextFile(BinPath)
For i = 1 To Len(BinText)
BinFile.Write Mid(BinText, i, 1)
Next
BinFile.Close
Set HexFile = Fso.CreateTextFile(HexPath)
HexFile.Write HexText
HexFile.Close
Gruß Dieter
@76109
Ich bevorzuge zwar das Einlesen am Stück - also etwa
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:
[/Edit]
Grüße
bastla
Ich bevorzuge zwar das Einlesen am Stück - also etwa
BinText = IcoFile.ReadAll
For j = 1 To Len(BinText)
h = Right("0" & Hex(Asc(Mid(BinText, j, 1))), 2): HexText = HexText & h & " "
i = i + 1
If i = 16 Then i = 0: HexText = HexText & vbCrLf
Next
[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
Grüße
bastla
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
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
@76109
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
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
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
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
Hallo aFrankhauser!
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
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.
Gruß Dieter
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:
AsciiToBin:
Gruß Dieter
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:
Set oD1 = Fso.OpenTextFile(IcoPath)
Set oD2 = Fso.CreateTextFile(TxtPath)
Do Until oD1.AtEndOfStream
oD2.Write Right("00" & Asc(oD1.Read(1)), 3)
Loop
oD1.Close: oD2.Close
AsciiToBin:
Set oD2 = Fso.OpenTextFile(TxtPath)
Set oD3 = Fso.CreateTextFile(BinPath)
Do Until oD2.AtEndOfStream
oD3.Write Chr(CInt(oD2.Read(3)))
Loop
oD2.Close: oD3.Close
Gruß Dieter
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
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
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
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
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
HexAsciiToBin
Gruß Dieter
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
Set oD1 = Fso.OpenTextFile(IcoPath)
Set oD2 = Fso.CreateTextFile(TxtPath)
Do Until oD1.atEndOfStream
oD2.Write Right("0" & Hex(Asc(oD1.Read(1))), 2)
Loop
oD1.Close: oD2.Close
Set oD2 = Fso.OpenTextFile(TxtPath)
Set oD3 = Fso.CreateTextFile(BinPath)
Do Until oD2.atEndOfStream
oD3.Write Chr(CInt("&H" & oD2.Read(2)))
Loop
oD2.Close: oD3.Close
Gruß Dieter
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
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
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
50m in 5,6 sekunden sind immer noch 3,2142... Km/h anstatt 32,142... Km/h
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
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