2012-11-27 8 views
1

J'essaie de convertir VB5 en .NET et ne peut pas obtenir une lecture binaire pour fonctionner. Mon décodage VB.NET lit uniquement les deux premiers caractères correctement. Le (VB5-> VB.NET) encode estOuvrir/Lire un fichier binaire - droits d'accès

' Open file 
    x = Rnd(-mKeyValue) 
    filenum = FreeFile() 
    Try 
     FileOpen(filenum, Filename, OpenMode.Binary) 
    Catch ex As IO.IOException 
     MsgBox(ex.ToString, MsgBoxStyle.Critical, "File opening error") 
     Exit Sub 
    End Try 
    ' write data 
    filecontents = ""  

    For i = 1 To Len(stringdate) 
     charnum = Asc(Mid(stringdate, i, 1)) 
     randomint = Int(256 * Rnd()) 
     charnum = charnum Xor randomint 
     singlechar = Chr(charnum) 
     FilePut(filenum, singlechar, i) 
     filecontents = filecontents & singlechar 
    Next i 

Et le (VB5-> VB.NET) deCODE

x = Rnd(-mKeyValue) 
    filenum = FreeFile() 
    FileOpen(filenum, Filename, OpenMode.Binary) 
    For i = 1 To LOF(filenum) 

     'To VB.NET 
     FileGet(filenum, singlechar, i) 
     charnum = Asc(singlechar) 
     Debug.Print("VB5 singlechar = " & singlechar) 
     randomint = Int(256 * Rnd()) 
     charnum = charnum Xor randomint 
     singlechar = Chr(charnum) 
    Next i 

Mon code VB.NET qui échoue (ne peut pas lire le fichier correctement) est;

 Using reader As New BinaryReader(File.Open(Filename, FileMode.Open)) 
     ' Loop through length of file. 
     Dim pos As Integer = 0 
     Dim length As Integer = reader.BaseStream.Length 


     While pos < length 
      ' Read the integer. 
      singlechar = reader.ReadChar() 
      charnum = Asc(singlechar) 'singlechar is type Char 
      randomint = Int(256 * Rnd()) 
      charnum = charnum Xor randomint 
      singlechar = Chr(charnum) 

      i += 1 
     End While 
    End Using 

Quelqu'un peut-il m'aider avec la traduction de VB5 à .NET?

Répondre

1

En VB.Net tout est un peu plus courte;)

' get a string from an encrypted file file: 
    Dim b() As Byte = IO.File.ReadAllBytes("path") 
    For i = 0 To b.Length - 1 
     b(i) = b(i) Xor (256 * Rnd()) 
    Next 
    Dim s As String = System.Text.Encoding.ASCII.GetString(b) 

Pourquoi lire octet par octet (pas de sens de lire « char » de toute façon, puisque vous voulez que le code ASCII 8 bits), lorsque .Net peut le lire à la fois? Votre fichier n'est pas plus grand> 100 Mo, je suppose? Ensuite, après avoir obtenu le tableau, vous simplement XOR chaque élément avec votre valeur "aléatoire". Si vous n'avez pas besoin d'être compatible avec les anciennes versions, vous pouvez utiliser Random. Ou peut-être encore mieux ... CRYPTAGE REAL UTILISER (en .Net il est intégré!)

' put a string into a file 
    Dim c() As Byte = System.Text.Encoding.ASCII.GetBytes("The String you want to store encrypted") 
    For i = 0 To c.Length - 1 
     c(i) = c(i) Xor (256 * Rnd()) 
    Next 
    IO.File.WriteAllBytes("another path", c) 

Même chose pour "chiffrer". Convertissez la chaîne en un tableau de byte (= valeurs ASCII), XOR it, puis réécrivez-la en UNE opération.

Voir les dangers de l'Unicode:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    ' Beware of UNICODE ... !!! 
    Using sw As New FileStream("foo.foo", FileMode.OpenOrCreate, FileAccess.Write) 
     ' with old VB you effectively wrote BYTE data 
     sw.Write({65, 192}, 0, 2) 
    End Using 

    Using br As New BinaryReader(File.Open("foo.foo", FileMode.Open, FileAccess.Read)) 
     ' You are telling. Net that you expect a CHAR, which is not ASCII, but UNICODE 
     Dim c As Char = br.ReadChar 
     Dim d As Char = br.ReadChar 
     Dim cc = Asc(c) 
     Dim dd = Asc(d) 
     Debug.Print("65 -> {0}, 192 -> {1}", cc, dd) 
    End Using 

End Sub 

La sortie est 65 -> 65, 192 -> 63

+0

igrimpe. Merci. Le décryptage fonctionne presque avec le code VB5 converti. Il s'exécute mais tous les caractères ne sont pas traduits dans l'original. J'avais espéré avoir un fichier de licence commun (<100 caractères) pour l'ancien VB5 et .NET, peut-être que ce n'est pas possible. J'ai recherché le CHIFFREMENT RÉEL; il semble que tout le code .NET n'est pas plus court/plus simple ...;) – Graham

+0

@Graham: QUEL code fonctionne "en partie"? Votre code (3e bloc), ou le mien? Si c'est à vous: ReadChar lit un CHAR qui dans VB.Net est par défaut un caractère UNICODE. Cela signifie que tous les caractères au-delà de "vrai" ASCII ne retourneront pas leur valeur initiale. Mieux vaut lire BYTE puisque vous avez écrit des octets avec votre ancien code VB5. J'ai mis à jour ma réponse avec un petit exemple de code pour montrer le problème. – igrimpe

+0

@grimpe C'est votre code qui fonctionne partiellement, les deux premiers caractères correspondent à la chaîne d'origine mais pas le reste. Mon troisième bloc échoue lamentablement. En utilisant vos exemples, j'ai maintenant réécrit la sécurité .NET et j'utiliserai un nom de fichier de licence différent. Cela n'aura pas vraiment d'importance car les DLL de sécurité (VB5, NET) ne liront que leur fichier approprié, donc si l'utilisateur place les deux fichiers dans l'un ou l'autre répertoire, seul le fichier correspondant sera lu. Merci pour l'aide. – Graham