1

VB5 を .NET に変換しようとしていますが、バイナリの読み取りが機能しません。私の VB.NET デコードでは、最初の 2 文字しか正しく読み取れません。(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 への変換を手伝ってくれる人はいますか?

4

1 に答える 1

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)

.Netが一度に読み取ることができるのに、なぜバイトごとに読み取るのですか(8ビットのASCIIコードしか必要ないため、とにかく「char」を読み取る意味はありません)。あなたのファイルは 100 MB を超えていませんよね?次に、配列を取得した後、各要素を「ランダム」値で XOR するだけです。古いバージョンとの互換性を維持する必要がない場合は、 を使用することをお勧めしますRandom。または、さらに良いかもしれません... USE 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 値) に変換し、XOR してから、1 回の操作で書き戻します。

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

于 2012-11-27T23:47:39.823 に答える