2012-11-27 69 views
1

我想將VB5轉換爲.NET,並且無法使二進制讀取正常工作。我的VB.NET解碼只能正確讀取前兩個字符。 的(VB5-> VB.NET)編碼是打開/讀取二進制文件 - 訪問權

' 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 

而(VB5-> VB.NET)解碼是

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 

我VB.NET代碼失敗(不能讀取該文件正確)是;

 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 

任何人都可以幫助我從VB5到.NET翻譯?

回答

1

在VB.Net一切都是短;)

' 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) 

爲什麼讀取字節(沒有意義的字節讀「字符」無論如何,因爲你只需要8位的ASCII碼),當.Net可以一次讀取它?您的文件不大於100 MB,我認爲?然後獲得數組後,您只需使用「隨機」值對每個元素進行異或運算。如果您不需要與舊版本兼容,則最好使用Random。或者甚至更好...使用REAL ENCRYPTION(在.Net中它是內置的!)

' 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) 

與「加密」相同。將字符串轉換爲一個字節數組(= ASCII值),對其進行異或運算,然後將其寫回一次。

見的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 

輸出是65 -> 65, 192 -> 63

+0

igrimpe。謝謝。解密幾乎與轉換後的VB5代碼一起工作。它運行但不是所有的字符都被翻譯回原來的。我曾希望爲傳統的VB5和.NET創建一個通用的許可證文件(<100個字符),或許這是不可能的。我查閱了真正的加密;它似乎並不是所有的.NET代碼更短/更簡單......;) – Graham

+0

@Graham:WHICH代碼「部分地」工作?你的(第三塊)代碼,還是我的?如果它是你的:ReadChar讀取一個CHAR,在VB.Net中默認是一個UNICODE字符。這意味着超出「true」ASCII的所有字符都不會返回它們的初始值。由於您使用舊的VB5代碼編寫了字節,因此應更好地閱讀BYTE。我用一些示例代碼更新了我的答案以顯示問題。 – igrimpe

+0

@grimpe它是你的代碼部分工作,前兩個字符匹配原始字符串,但其餘的不是。我的第三塊失敗慘敗。使用您的示例,我現在重寫了.NET安全性並將使用不同的許可證文件名。這並不重要,因爲安全DLL(VB5,NET)只會讀取它們合適的文件,所以如果用戶將這兩個文件放入任一目錄中,只有相關的文件將被讀取。謝謝您的幫助。 – Graham