Bytes aus beliebiger Datei auslesen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von sycyrius.

    Bytes aus beliebiger Datei auslesen

    Hallo liebe Foren-Gemeinde,

    ich möchte ein Programm schreiben, welches die Bytes aus einer beliebigen Datei ausliest und diese dann in einem Textfeld ausgibt.

    Ich habe bereits eine Lösung (Daten = Bytearray, txtAusgabe = Textfeld):


    VB.NET-Quellcode

    1. daten = My.Computer.FileSystem.ReadAllBytes("C:\test.txt")
    2. For Each b As Byte In daten
    3. txtAusgabe.Text &= b.ToString() & " "
    4. Next

    Allerdings dauert es mit dieser Lösung sehr lange Dateien mit einer Größe von mehreren KB auszulesen,

    deshalb suche ich eine bessere und schnellere Lösung.



    Schon mal vielen Dank im voraus!
    Wenn du den Inhalt der Datei auslesen willst und in einem Textfeld anzeigen lassen willst, nimm doch einfach die Methode:

    VB.NET-Quellcode

    1. dim dateiinhalt as string = my.computer.filesystem.readalltext ("Pfad der Datei")
    2. textbox1.text = dateiinhalt
    Danke für die schnellen antworten, aber leider sind sie nicht ganz das was ich brauche.

    Ich möchte einfach die Bytes, aus denen jede Datei besteht, auslesen.



    Später will ich versuchen diese Bytes als string über eine TCP-Verbindung zu versenden und am anderen Ende wieder zusammenzusetzen.

    Bei Textdateien könnte ich tatsächlich einfach den Inhalt auslesen und als string versenden, aber bei .exe Dateien kann ich keinen text auslesen...



    P.S.: Sorry, wenn ich meine Frage nicht eindeutig formuliert habe :D !
    Hi

    VB.NET-Quellcode

    1. Dim raw() As Byte = 'Dateiinhalt
    2. Dim sb As New System.Text.StringBuilder(raw.Length * 4)
    3. For each bt As Byte In raw
    4. sb.Append(bt.ToString())
    5. sb.Append(" "c)
    6. Next
    7. MyTextBox.Text = sb.ToString()


    Oder in Hexadezimaldarstellung:

    VB.NET-Quellcode

    1. Dim raw() As Byte = 'Dateiinhalt
    2. Dim sb As New System.Text.StringBuilder(raw.Length * 3)
    3. For each bt As Byte In raw
    4. sb.Append(Convert.ToString(bt,16))
    5. sb.Append(" "c)
    6. Next
    7. MyTextBox.Text = sb.ToString()


    Warum deins sehr lange dauert: Es wird jedes mal ein neuer String erzeugt, wenn du eine Verknüpfung mit & oder + machst, da nicht der bestehende String verändert wird, sondern dieser kopiert wird und die anderen Daten angehängt werden. Der StringBuilder löst dies, indem er den Speicher allokiert, der benötigt wird, diesen verändert und zum Schluss den Inhalt kopiert und als String zurückgibt.

    Edit:
    Wozu willst du die Bytes dann erst als String einlesen?

    Gruß
    ~blaze

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    Danke für die antwort und die erklärung ~blaze~,

    aber bei deinem Code unterstreicht mir VB 2010 Express immer das stringbuilder. Ich bin leider noch ein blutiger Anfänger und habe noch nie von stringbuildern gehört ;( .




    Zu deiner Frage:

    Ich möchte die Bytes als string einlesen, da ich als TCP-Verbindung nur tcplistener und tcpclient kenne und die nun mal nur strings versenden. Ich bin, wie gesagt, noch ein

    Anfänger und wenn jemand eine bessere Alternativer kennt...



    Danke im Voraus!
    Auszug aus der Client-Klasse von VersuchsChat

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.Text
    4. Public Class Client : Inherits TCPBase
    5. Private _TcpClient As TcpClient
    6. Private _Stream As NetworkStream
    7. Public Sub New(ByVal TC As TcpClient)
    8. _TcpClient = TC
    9. _Stream = _TcpClient.GetStream
    10. End Sub
    11. Public Overrides Sub Send(ByVal Msg As String)
    12. Dim Buf() As Byte = Encoding.UTF8.GetBytes(Msg)
    13. _Stream.Write(Buf, 0, Buf.Length)
    14. End Sub
    15. End Class

    Du siehst: in den _Stream werden eh nur Bytes geschrieben, und es ergibt sich nur deshalb ein String, weil diese Bytes das Ergebnis eines Encodierungs-Vorganges des Utf8-Encodings sind.

    Eine Methode

    VB.NET-Quellcode

    1. Public Overrides Sub Send(ByVal Buf() As Byte)
    2. _Stream.Write(Buf, 0, Buf.Length)
    3. End Sub
    würde die Bytes so wegschicken.
    Habe inzwischen selber herausgefunden was ein stringbuilder ist. ~blaze~' Lösung ist eindeutig schneller als meine,

    allerdings bleibt bei einer .exe mit etwa 3MB, das Textfeld leer. Kann mir jemand sagen warum???

    Bei kleineren Dateien klappt es einwandfrei!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sycyrius“ ()

    Hatte vergessen, das dazu zu schreiben, dass man System.Text importieren muss, sry. (hab jetzt einfach oben den Namensraum überall ergänzt). Verwende lieber den Weg, den dir ErfinderDesRades vorschlägt. Wenn du Bytes so codiert verschickst, wie ich es dir gezeigt habe, erhältst du pro Buchstaben AnzahlDerBytesDesBuchstaben * LängeDesStrings * (3 bzw. 4) Bytes. Wenn du dagegen das, was ErfinderDesRades dir vorschlägt verwendest, hast du AnzahlDerBytesDesBuchstaben * LängeDesStrings Bytes, was somit viel kürzer ist und effizienter.

    Warum das mit den 3 MB ist, kann ich mir so noch nicht erklären.

    Gruß
    ~blaze~
    Ich komme mit ErfinderDesRades' Code nicht so ganz klar.

    Wofür stehen das

    VB.NET-Quellcode

    1. Public Class Client : Inherits TCPBase


    das

    VB.NET-Quellcode

    1. Public Sub New(ByVal TC as TcpClient)


    und das

    VB.NET-Quellcode

    1. Public Overrides Sub Send(ByVal Msg As String)


    ?(
    Ich habe es jetzt geschafft die Bytes direkt zu versenden, aber wie kann ich sie wieder zu einer Datei zusammensetzen und warum werden große Dateien nicht umgewandelt? Ist vielleicht eine Grenze bei dem Bytesarray erreicht, sodass nicht mehr hineingeschrieben werden kann?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „sycyrius“ ()

    Na ja,

    das mit den Konzepten von Streams werde ich mir wohl noch mal etwas genauer ansehen müssen, aber da meine anfängliche Frage

    ja gelöst wurde, werde ich das Thema vorerst als gelöst markieren. Wenn ich dann noch Fragen habe, kann ich ja noch mal genauer nachfragen.

    Allen Danke für die Hilfe :thumbsup: !