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

VB Express String in Datei schreiben unterschiedl Zeichenanzahl

Frage Entwicklung VB for Applications

Mitglied: florengray

florengray (Level 1) - Jetzt verbinden

19.07.2008, aktualisiert 20.07.2008, 6222 Aufrufe, 16 Kommentare

Hallo,
Suche hat leider nix gebracht.

Also ich schreibe ein Programm, in dem ich so erstmal zwei Var habe.

tmp_1 As String tmp_2 As String
tmp_1 enthält Daten, die ich verschlüsseln will.
tmp_2 enthält zufällige Zeichen 224 * Rnd() + 31 (Damit will ich keine Steuerzeichen drin haben)
Dann verschlüssele ich einfach, indem ich die Zeichenwerte addiere und das entstandene Zeichen in eine andere Variable schreibe.
Das geht auch.
Im Programm sind beide "noch" 32 Zeichen lang. (Per Length ermittelt)
Wenn ich diese dann per fso in eine Datei schreibe, dann passt das aber nicht mehr.
Dann ist der eine 46 der andere 58 Zeichen lang?????????????
Oder auch andere Werte.
Kann mir einer sagen was da nicht passt.
Ich krieg das dann nämlich nicht mehr entschlüsselt!

Ach ja, ich benutze ChrW() um das entstandene Zeichen zu ermitteln.

Freue mich auf Antworten!!!

florengray
Mitglied: bastla
19.07.2008 um 20:20 Uhr
Hallo florengray!

Wozu ChrW()? Es sollte doch Chr() genügen.
Und noch ganz nebenbei:
01.
224 * Rnd() + 31
kann auch 31 ergeben, also besser
01.
Int(224 * Rnd()) + 32
Grüße
bastla
Bitte warten ..
Mitglied: florengray
19.07.2008 um 20:40 Uhr
Hallo bastla!
Ja, aber wenn in tmp_1 ein Zeichen mit 124 vorkommt und mein tmp_2 an der Stelle ein Zeichencode mit 132 hat dann komme ich ja über 255.
Und das kann Chr() nicht.
Was sagst du denn zu dem "Problem"?
Ich versteh es nicht. Wieso habe ich im Programm beide mit 32 Stellen und dann in der Datei was anderes? Ich hab die Datei mal mit Notepadd ++ geöffnet und versch. Formate ausgewählt. Egal.
Einer ist z.B. 46 und der andere 52 Stellen lang.
Ich hab mich nämlich gewundert warum ich permanent die Fehlermeldung bekomme:
"... Der String darf nicht 0 (Null) sein..."
Daraufhin habe ich mühsam gesucht und gefunden, dass beim Entschlüsseln die beiden eingelesenen Zeilen versch. lang sind. Und damit kann ich keine Entschlüsselung machen.
Komischerweise geht es, wenn ich statt der Randomanweisung einfach dem tmp_2 mit den Chr(0) oder Chr(1) fülle. Dann geht es?????
Aber es geht nicht mehr, wenn ich z.B. tmp_2 durchgehend mit Chr(98) oder so belege.
Ich kann es nicht nachvollziehen.
Zuerst hatte ich gedacht, dass bestimmte Steuerzeichen daran schuld wären, aber die habe ich ja mit +32 dann ausgeklammert. Der Fehler ist aber trotzdem noch da!???
Ziel sollte es sein, eine One-Time-Pad Verschlüsselung zu demonstrieren.
Das Vorgehen: Für jede Zeile wird immer ein neuer Schlüssel generiert. (tmp_2)
Genau so lang, wie die Zeile, die verschl. werden soll.
Dann wird die Zeile verschlüsselt. (Zeichenwerte addieren)
Dann wird der generierte Schlüssel mit dem Benutzerpasswort verschlüsselt.
In der Datei steht dann eine Zeile verschlüsselte Daten und daneben der verschlüsselte generierte Schlüssel, der nur mit dem Benutzerpasswort entschlüsselt werden kann um dann an die Daten zu kommen.
Der Sinn: Man erfährt nicht wirklich, welcher Schlüssel schon verwendet wurde. (Wird ja intern alles geregelt)
Ändert trotzdem nichts an dem Problem.
Aber trotzdem Danke.

florengray
Bitte warten ..
Mitglied: bastla
19.07.2008 um 21:02 Uhr
Hallo florengray!

Leichter nachvollziehbar wird's grundsätzlich, wenn Code nicht nur beschrieben, sondern auch gepostet wird ...

Versuch es einmal mit
01.
Int(256 * Rnd()) + 256
Damit entstehen dann auf jeden Fall Zeichen mit einem Code >= 256, welche dann jeweils 2 Byte für die Speicherung benötigen.

Grüße
bastla
Bitte warten ..
Mitglied: florengray
19.07.2008 um 21:48 Uhr
01.
        
02.
        Randomize() 
03.
 
04.
        'Aus Array eine Zeile machen 
05.
        Dim tmp_1 As String 'Zeile -> String 
06.
        Dim tmp_2 As Integer 'Länge von Zeile 
07.
        Dim tmp_3 As String 'Neue Länge vom UserPW 
08.
        Dim tmp_4 As String 'RndPW 
09.
        Dim tmp_5 As String 'Verschlüsselte Zeile 
10.
        Dim tmp_6 As String 'Verschlüsseltes RndPW 
11.
 
12.
        For a = 0 To Aktualisierungsrate - 1 'Array jede Zeile berücksichtigen 
13.
 
14.
            For b = 0 To 4 'Jede Spalte auslesen 
15.
 
16.
                tmp_1 += Log_Table(a, b) & " # " 'Zusammensetzen der Daten zu einer Zeile 
17.
                Log_Table(a, b) = Nothing 
18.
                tmp_2 = tmp_1.Length() 
19.
 
20.
            Next b 
21.
 
22.
            If User_PW.Length() > tmp_2 Then 'UserPW auf neue Länge zurechtschneiden 
23.
                tmp_3 = Mid(User_PW, 1, tmp_2) 
24.
            ElseIf User_PW.Length() = tmp_2 Then 
25.
                tmp_3 = User_PW 
26.
            ElseIf User_PW.Length() < tmp_2 Then 
27.
                tmp_3 = User_PW & Mid(User_PW, 1, tmp_2 - User_PW.Length()) 
28.
            End If 
29.
 
30.
            For c = 1 To tmp_2 'Jedes Zeichen auslesen 
31.
 
32.
                tmp_4 += Chr(Int(223 * Rnd() + 32)) 'Zufallspasswort generieren ohne Steuerzeichen 
33.
                 
34.
            Next c 
35.
 
36.
            For d = 1 To tmp_2 
37.
 
38.
                'Zeile verschlüsseln 
39.
                tmp_5 += ChrW(Asc(Mid(tmp_1, d, 1)) + Asc(Mid(tmp_4, d, 1))) 
40.
 
41.
                'RndPW verschlüsseln 
42.
                tmp_6 += ChrW(Asc(Mid(tmp_4, d, 1)) + Asc(Mid(tmp_3, d, 1))) 
43.
 
44.
            Next d
Das ist mein Modul, wo die Daten verschlüsselt werden. Ich hoffe man kann es lesen.
In was für einem Format werden Dateien denn gelesen, wenn man ein fso benutzt?
ASCII nehme ich an.
Könnten da evt. leseschwierigkeiten auftreten? Eigentlich ja nicht, denn ich schreibe auch mit nem fso.
Bitte warten ..
Mitglied: bastla
19.07.2008 um 22:03 Uhr
Hallo florengray!

In was für einem Format werden Dateien denn gelesen, wenn man ein fso benutzt? ASCII nehme ich an.
Das kannst Du als 4. Parameter (nach Dateiname, E/A-Modus und Erstellen) beim Öffnen angeben (True = Unicode, False bzw keine Angabe = ASCII).
Ziel sollte es sein, einheitlich Zeichen mit einem Code >= 256 zu erzeugen. Dies kannst Du erreichen, indem Du entweder, wie oben vorgeschlagen, das ZufallsPW in einen entsprechenden Bereich bringst, oder jeweils beim Verschlüsseln in den Zeilen 39 und 42 zB zusätzlich 256 addierst (und beim Entschlüsseln natürlich wieder subtrahierst).

Grüße
bastla
Bitte warten ..
Mitglied: florengray
19.07.2008 um 22:10 Uhr
Hört sich gut an.
Werd ich mal ausprobieren.
ChrW() geht ja von -32768 bis 65535. Was sind denn das noch für Zeichen? Keine oder? EInfach nur ein Wert.
Aber vielen Dank für den Tipp!!

florengray
Bitte warten ..
Mitglied: florengray
20.07.2008 um 00:25 Uhr
Hallo nochmal.
Ich glaube den Fehler gefunden zu haben.
Wenn mein Programm zum Beispiel einfach nur "Testnachricht" in die Datei schreibt, so liest mein anderes Programm dieses als xxxTestnachricht aus. xxx sind hier Unicode Zeichen. Wo die herkommen ist mir schleierhaft.
Wenn dann noch "Testschlüssel" geschrieben wird und dann wieder ausgelesen wird, so steht da nicht Testschlüssel sondern Testschlüssel. Darum entstehen die Diskrepanzen zwischen den Zeilenlängen.

Ich öffne meine Datei so:

01.
        Dim fso ' FileSystemObject 
02.
        Dim textfile ' Dateiobjekt 
03.
 
04.
        fso = CreateObject("Scripting.FileSystemObject") 
05.
       textfile = fso.OpenTextFile(Filename) 
06.
 
07.
       Do While textfile.AtEndOfStream <> True 
08.
 
09.
            ReDim Preserve Read_Line(Counter_Array_File_Read) 
10.
 
11.
            Read_Line(Counter_Array_File_Read) = textfile.ReadLine  
12.
            Counter_Array_File_Read += 1 
13.
 
14.
        Loop 
15.
 
16.
        textfile.Close()
Ich hab da nicht gefunden, wo ich die per Unicode öffnen kann.
Kann man mir noch sagen, ob es eine Methode gibt, die gleich Dateien im Unicode Format schreibt?

Ich hab noch sowas ausprobiert:

01.
        Dim inhalt = "" 
02.
        FileSystem.FileOpen(1, Filename, OpenMode.Input, OpenAccess.Read) 
03.
        Input(1, inhalt)
Aber da wird nur eine Zeile ausgelesen und anscheinend auch nur im ASCII Format.

florengray
Bitte warten ..
Mitglied: bastla
20.07.2008 um 00:34 Uhr
Hallo Florengray!

Grundsätzlich sollte (allerdings ungetestet) mit den folgenden Codezeilen das Schreiben bzw Einlesen eines Textes über ein Array im Unicode-Format zu bewerkstelligen sein:
01.
Dim fso ' FileSystemObject 
02.
fso = CreateObject("Scripting.FileSystemObject") 
03.
 
04.
'Schreiben des Arrays Read_Line 
05.
fso.OpenTextFile(Filename, 2, True, True).Write Join(Read_Line, vbCrLF) 
06.
 
07.
'Einlesen in das Array Read_Line 
08.
Read_Line = Split(fso.OpenTextFile(Filename, 1, True, True).ReadAll, vbCrLF)
Grüße
bastla
Bitte warten ..
Mitglied: florengray
20.07.2008 um 14:39 Uhr
Hallo,
Sieht gut aus, aber ich muss kein Array schreiben, sondern einfach nur einen String.
War vorher vielleicht verwirrend geschildert.
Ich habe ein Array. Daten(10, 4) Aber das wird dann mit einer For in 10 einzelen Strings umgewandelt und die werden dann Zeilenweise geschrieben.
Wenn ich das dann lesen muss, so bracuh ich nur die Zeilen aus der Datei auslesen. Den Rest hab ich schon. Ich muss jetzt nur ne Möglichkeit finden, wie ich alles im Unicode Format schreiben und lesen kann.

florengray
Bitte warten ..
Mitglied: bastla
20.07.2008 um 14:44 Uhr
Hallo florengray!

Das Array in meinem Beispiel besteht aus den einzelnen Zeilen der Textdatei - durch die Trennung am Zeilenende (vbCrLf) wird der gesamte Text nach dem Lesen in ein String-Array aufgesplittet bzw beim Schreiben das Array mit Join() wieder zum Gesamttext zusammengefügt.

Grüße
bastla
Bitte warten ..
Mitglied: florengray
20.07.2008 um 14:55 Uhr
Versteh ich nicht wirklich.
Ich weiss was Split macht. Aber ich hab kein Array was ich Join() geben könnte.
Wenn ich jetzt meine Daten schreiben will, dann hab ich das hier:
Output_Log_String. Das ist nur eine var. als String deklariert. Die muss nun in ne Datei geschrieben werden im Unicode Format.
Wenn ich jetzt in deinem Beispiel beim schreiben die Read_Line bei Join() durch mein Output_Log_String ersetze dann kommt ein Überladungsfehler. Und ein Konvertierungsfehler von String und 1-Dimensionales Array.
Is ja logisch, denn Join() braucht ein 1-Dimensionales Array und mein Output_Log-String ist keines.

Grüße florengray

edit:
Ich habst jetzt so geamcht:
<code
'Schreiben des Arrays Read_Line
fso.OpenTextFile(File_Name, 2, True, True).WriteLine(Output_Log_String)
Output_Log_String = Nothing
</code>

Um zu testen, ob Unicode geschrieben wird, habe ich einfach von Word her Φ eingefügt. Mit False wird ein F mit True ein Φ geschrieben.
Das scheint nu zu gehen.

Mal sehen, wie es jetzt beim lesen aussieht.

florengray
Bitte warten ..
Mitglied: bastla
20.07.2008 um 15:15 Uhr
Hallo florengray!

Die Verwendung des Arrays in meinem Beispiel ergab sich aus Deinem geposteten Einlesealgorithmus, in welchem Du ja ebenfalls ein (dynamisches) Array einsetzt - meine Zeile 8 ersetzt nur Deine Zeilen 5 bis 16 ...

... aber wenn es tatsächlich nur eine Zeile sein soll, ist natürlich "ReadLine/WriteLine" ausreichend.

Grüße
bastla
Bitte warten ..
Mitglied: florengray
20.07.2008 um 15:25 Uhr
Hallo,
habs jetzt auch gerafft. Soweit scheint das zu funktionieren. Es treten keine Differenzen zwischen den Zeilenlängen auf. *freu*
Aber kannst du mir noch verraten, wo du die Parameter für dein
01.
fso.OpenTextFile(Filename, 2, True, True)

herbekommen hast? Ich find da nix.
Vielleicht suche ich aber auch falsch.

Ansonsten scheint bis jetzt erstmal alles zu funktionieren.


Besten Dank!!!!

florengray

:edit
Nee so ganz gehts noch nett.
Das mit den Längen geht jetzt. Aber beim entschlüsseln, werden die Zeichen nicht mehr richtig dargestellt.
?5:01 12 # # 562$413 ? 7
    1. ??
    sowas kommt daraus, aber es müssten erstmal 4 Zeilen sein und die sind auch viel, viel länger.

    Weisst du warum das nicht geht?

    Ich hab von dem Zeichen, wa sich verschl will, den Zeichencode abgefragt mit Asc().
    Dann habe ich den Zeichencode von Schlüssel mit Asc() abgefragt.
    Dann hab ich die beiden addiert.
    Nach dem gleichen Verfahren hab ich auch dann den Schlüssel mit dem BenutzerPW verschl.

    Der Weg müsste jetzt eigentlich nur Rückwärts sein.
    Aber das scheint nicht richtig zu gehen.

    Ahhhh!!!
    Ich rufe ja beim entschl mit Asc() ab. Und habe aber Werte über 255!!!!
    das geht ja auch nicht. *Mensch*

    Aber jetzt Stellt sich die Frage, wie kann ich die Werte auch über 255 abrufen???

    Weisst du da was?

    florengray

    :edit

    Joo,
    mit AscW() gehts.

    florengray
Bitte warten ..
Mitglied: bastla
20.07.2008 um 16:37 Uhr
Hallo florengray!

Die gesuchten Parameter findest Du hier: OpenTextFile Method (bzw ausgehend von der FSO-Doku).


Grüße
bastla
Bitte warten ..
Mitglied: florengray
20.07.2008 um 16:45 Uhr
Super! So was habe ich schon lange gesucht!

Vielen Dank für alles!

florengray
Bitte warten ..
Mitglied: bastla
20.07.2008 um 16:52 Uhr
Hallo florengray!

Vielen Dank für alles!
Wofür denn - hast ja ohnehin fast alles selbst gelöst ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Batch & Shell
gelöst 2 große TXT Dateien vergleichen und Unterschiede in andere Datei schreiben (6)

Frage von sid.pdm zum Thema Batch & Shell ...

Windows Systemdateien
gelöst Registry-Schlüssel per Batch auslesen und in Datei schreiben (9)

Frage von Philzip zum Thema Windows Systemdateien ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...