VisualBasic Datei binär öffnen und wieder abspeichern

Clocker 2800+

Lt. Commander
Registriert
Apr. 2007
Beiträge
1.409
Hi.

ich bin auf der Suche nach einem Code, der in Visual Basic 6

eine Datei binär einliest,

den Binärcode (also 0 und 1) z.b. in einem Textfeld anzeigt, und

aus den Binärcode die (selbe) Datei daraus wieder abspeichert...


Ich suche jetzt schon stundenlang danach, aber ich finde nichts.. :(

/edit: Frohe Weihnachten allesamt.
 
Zuletzt bearbeitet:
Ich habe jetzt keine direkte löung für dich, aber einen kleinen Fingerzeig für deine Suche.

Im Endeffekt soll dein Programm doch nichts anderes machen als ein Hex-Editor, nur dass er eben die daten in binär und nicht in hexadezimal ausgibt, oder?
Such doch vllt einfach mal danach wie man einen Hex-Editor umsetzt, warscheinlich wirst du dir nur die "in Hex codier"-Komponente sparen müssen....
ich hoffe ich war dir eine Hilfe....

gruß, arjen
(und allen ein frohes Weihnachtsfest)

edit:
http://sourceforge.net/projects/hexeditorvb/
ein Hex-Editor mit VB Source Code.

beachte aber unter welcher Linzenz das Projekt steht bevor du kopierst(Copyleft-Prinzip und so ;)
 
Zuletzt bearbeitet:
Im Endeffekt soll dein Programm doch nichts anderes machen als ein Hex-Editor, nur dass er eben die daten in binär und nicht in hexadezimal ausgibt, oder?


Mein Programm soll eine beliebige Datei binär einlesen und dann die 0 und 1 in einer Textbox anzeigen

und im 2ten Schritt aus den 0 und 1 in der Textbox wieder die gleiche Datei abspeichern...


So wie das Beispiel hier:
http://www.activevb.de/tipps/vb6tipps/tipp0268.html

Nur dass ich die 0 und 1 in einer Textbox angezeigt haben will....
 
Zuletzt bearbeitet:
- Lies die Datei Byte für Byte
- Nimm von jedem einzelnen Byte die einzelnen Bits und. gib dann entsprechend eine '0' oder eine '1' aus. So machst du aus einem Byte acht Zeichen.
 
Vorerst ein Frage: Verwendest du Visual Basic (5.0, 6.0?) oder Visual Basic.Net? Der Grund ist, das du bei VB.Net weitaus bessere Dateilese bzw. -schreib Funktionen/Klassen hast. Ohne diese Info kann ich dir nicht helfen...
 
http://www.vb-helper.com/howto_read_write_binary_file.html

Auf die Art kannst du die binäre Datei lesen und schreiben (siehe oberen Link). Für das Konvertieren der Bytes in die binäre Darstellung, würde ich jedes Bit vergleichen, ob es gesetzt ist, z.B.

Code:
Dim sCode As String = ""
If ((b And 128) = 128) Then sCode="1" Else sCode = "0"
If ((b And 64) = 64) Then sCode=sCode & "1" Else sCode = sCode & "0"
If ((b And 32) = 32) Then sCode=sCode & "1" Else sCode = sCode & "0"
If ((b And 16) = 16) Then sCode=sCode & "1" Else sCode = sCode & "0"
If ((b And 8) = 8) Then sCode=sCode & "1" Else sCode = sCode & "0"
If ((b And 4) = 4) Then sCode=sCode & "1" Else sCode = sCode & "0"
If ((b And 2) = 2) Then sCode=sCode & "1" Else sCode = sCode & "0"
If ((b And 1) = 1) Then sCode=sCode & "1" Else sCode = sCode & "0"

Für das Konvertieren von String in Byte würde ich dann den Or Operator verwenden:

z.B.
Code:
Dim b As Byte
If Mid(sCode,8,1) = "1" Then b = (b Or 1)
If Mid(sCode,7,1) = "1" Then b = (b Or 2)
If Mid(sCode,6,1) = "1" Then b = (b Or 4)
If Mid(sCode,5,1) = "1" Then b = (b Or 8)
If Mid(sCode,4,1) = "1" Then b = (b Or 16)
If Mid(sCode,3,1) = "1" Then b = (b Or 32)
If Mid(sCode,2,1) = "1" Then b = (b Or 64)
If Mid(sCode,1,1) = "1" Then b = (b Or 128)

Ist zwar nicht unbedingt die beste Variante das Problem zu lösen. Wers besser kann, sollte das hier mal posten...

BTW: Überlege mal, ob du vielleicht auf VB 2005/2008 upgradest. Vieles ist da einfacher und leichter zu lösen, u.a. auch dieses Problem... Die Express Versionen von Visual Studio sind kostenlos und können von Microsoft heruntergeladen werden.

Viel Erfolg!
 
Zuletzt bearbeitet:
Ok. Aber das wird bei ner 80Kb Datei z.b. auch einige Minuten dauern oder ?

Ich hab überlegt es sollte eigentlich gehen, wenn man die Datei ganz normal einliest, dann den "String" in HEX umwandelt, den HEX in Binär und dann wieder genauso zurück..

Das geht auch. Ich habs ausprobiert, nur leider dauert es bei ner 80KB Bilddatei ganze 13 Minuten, bis das HEX in Binär umgewandelt wurde und geschweige denn das ganze wieder zurück ^^ :(

Drum die Frage:
Was ist schneller? Der obige Code (von Rossibaer) oder mein HEX -> Binär Beispiel ?

/edit: Aber ich denke dass es auch nicht schneller geht, die Datei gleich als Binärzahlen anzuzeigen... Oder irre ich mich da ? (Also ohne den Schritt zu HEX)
 
Zuletzt bearbeitet:
@Erdmännchen: BinaryReader sollte doch erst ab VB.Net verfügbar sein, aber Clocker2800+ verwendet noch eine uralte Version von VB (VB 6.0)!

@Clocker: Die Konvertierung von Byte in die Binäre Darstellung benötigt nicht den String zu Hex Schritt, somit wirst du schon mal bei einer 80K Datei die Schleife zum Durchlaufen um 80000 Schritte reduzieren. Dennoch wirst du um die 80000 Schritte bei der Konvertierung von Byte zu Bin nicht drum herum kommen. Was aber da viel Zeit brauchen wird, ist nicht das Durchlaufen der Bytes sondern das Konkatieren des Strings für ein Byte, sprich das Bilden des Strings. Poste mal deinen Code für die Hex Konvertierung...

Das Concatieren von Strings kann durch folgendes wahrscheinlich beschleunigt werden:

http://www.nirsoft.net/vb/strclass.html

PS: Erdmännchen, ich musste schon wieder die Ameise von meinem Monitor zerdrücken... :D
 
Zuletzt bearbeitet:
Also ich hätte es so gemacht:
Code:
Dim fileStream As FileStream = New FileStream("C:\Test.txt", FileMode.Open)
Dim binReader As BinaryReader = New BinaryReader(fileStream)
Dim fileLength As Integer = fileStream.Length()
Dim array(fileLength) As Byte

For i As Integer = 0 To fileLength - 1
array(i) = binReader.ReadByte()
TextBox1.AppendText(Convert.ToString(array(i), 2) & vbTab & Hex(array(i)).ToString & vbTab & array(i).ToString & vbNewLine)
Next i

Mit Convert.ToString(Zahl, 2) stellst du es binär dar, mit Hex(Zahl).ToString eben in hexadezimal (als Vergleich noch in Dezimaldarstellung einfach array(i).toString )

Wichtig ist das Byte-weise einlesen in der Schleife. Wie du das dann darstellst ist dem Rechner wurscht, für ihn bleiben es Bits...

Wichtig:
Imports System.IO nicht vergessen ;)


EDIT:
Ach so....kein VB.NET .... das ist natürlich zu blöd :D
 
Also hier mal der Code der von HEX auf BINÄR umwandelt..

Code:
Dim strInput As String
   Dim intPosition As String
   Dim strBinary As String
   Dim intInd As Double
   Dim intIndex As Double
   Const strCompare As String = "0123456789ABCDEF"

   strBinary = ""
   strInput = StrConv(hexinput, vbUpperCase) ' Make all letters upper case
   txtOutput.Visible = True
   ' This loop checks last character in input string
   ' to find a position match in strCompare,
   ' shortens string by chopping off last character in input string,
   ' uses position match number to convert to binary,
   ' and repeats for next character
   For intInd = 1 To Len(strInput)
      intPosition = InStr(strCompare, Right(strInput, 1)) ' Character match
      strInput = Left(strInput, (Len(strInput) - 1)) ' Chop off last character
      If intPosition = 0 Then ' Is zero if no match is found for character
         txtOutput.Visible = False
         Exit Sub
      End If
      intPosition = intPosition - 1 ' Remove error value of zero
      
      strBinary = " " + strBinary ' Separate nibbles
      
      For intIndex = 0 To 3 ' Change to binary starting with LSB
         
         strBinary = CStr(intPosition Mod 2) + strBinary ' Even/odd is 0/1 (binary)
         
         intPosition = intPosition / 2 ' Go to next binary bit
         intPosition = Round(intPosition - 0.1) ' Round down from decimal number
      Next intIndex
      
   Next intInd
   
txtOutput.Text = strBinary

Und DAS dauert halt einfach viel zu lange... :(

Und die Funktion (der Link) das Rossibaer geschrieben hat, bekomme ich da einfach nicht zum Laufen...
 
Das einzige was mir jetzt einfällt ist: Update to Visual Basic .Net ;)

Edit: Warum bekommst du die Codes in den Links nicht zum Laufen? Woran hakt es? Welche Fehlermeldungen kommen? Ohne etwas mehr Info wird das ganze zum Blindflug bei stürmischen Wetter!

Im Übrigen reduziere mal deine Formatierungen ala "Fett" und Ausrufezeichen. Man kann das ganze auch ohne gut lesen und es wirkt weniger aggressiv auf den hilfsbereiten Leser.
 
Zuletzt bearbeitet:
Also besten Dank für alle die hier hilfreiche Tipps gegeben habe..

Aber ich begrabe nun das Projekt...

Es gibt bessere Alternativ-Programme, die es schneller erledigen können..

Danke nochmal allen, die mir versucht haben zu helfen.

Ach ja: Die Idee sollte eine Art Dateikomprimierer werden

Quasi nach bestimmten Vorkommnissen (z.b. "00" daraus nur eine "0" zu machen, und das ganze dann als "Archiv"-Datei neu abspeichern...
Aber ich denke Rar oder 7z werd ich niemals schlagen xD
 
Zuletzt bearbeitet:
Hi Clocker 2800,

die Idee einen Dateikomprimierer zu schreiben, ist sicher ganz nett, jedoch klingt der Ansatz nicht gut um wirklich die Datei komprimieren zu können, weil du zuerst aus einem Byte der Datei 8 Byte gemacht hättest. Dann die 0 zu komprimieren indem nur eine 0 gesetzt wird, würde wahrscheinlich dazu führen das du die Datei nicht mehr dekomprimieren kannst, weil da nicht mehr genau zwischen 0 und 00 unterschieden werden kann. Es geht die Information unter, wie oft die 0 in der Ursprungsdatei an beliebiger Stelle wiederholt wurde.

Um einen Komprimieralgorithmus zu implementieren, würde ich eher so verfahren, das ich die Vorkommen der Bytes von 0x0 bis 0xFF entsprechend zähle, d.h. Byte 0x02 kommt 600x vor, Byte 0xFF kommt 30x vor. Danach würde ich jedem Byte einen eindeutigen Code zuordnen, wobei die Häufigkeit entscheidend ist für die Größe des Codes. Dabei achtet man darauf das ein Code nicht als ein anderer Code interpretiert werden kann. Zu guter letzt werden dann die Bytes durch den entsprechenden Code ersetzt und in die Archivdatei geschrieben. Das wäre zumindest der grobe Ansatz um eine Komprimierung nach Huffman zu erreichen. Siehe auch http://de.wikipedia.org/wiki/Shannon-Fano-Kodierung#Huffman-Code
 
Zuletzt bearbeitet:
Für das Vorhaben ist VB auch die total falsche Sprache. Da solltest du schon C o.ä. verwenden, alleine weil es systemnaher ist und dementsprechend mehr Handling auf dieser Ebene ermöglicht.

Dass du RAR schlägst ist natürlich utopisch. ;)

Das wäre wohl "reinventing a square wheel". Es sei denn du findest einen so cleveren Algorithmus, der alles in den Schatten stellt was bisher da ist. Dafür reicht aber zunächst einmal Zettel & Papier - und da ist lange Zeit Mathematik die Sprache deiner Wahl.
 
VB ist völlig ausreichend für dieses Vorhaben, da es alle nötigen Elemente für die Realisierung enthält. U.U. kann C lediglich die Performance steigern, wobei auch in C schlechte Programme geschrieben werden können. So systemnah muss das ganze nicht sein um zum Ziel zu kommen.
 
Zurück
Oben