Переменная, предотвращающая добавление большего количества текста в строку?

Я так потерян в данный момент, почему я не могу заставить работать что-то настолько простое!

Я расшифровываю значение и добавляю его в строку, например.

 MessageBox.Show("TEST 1: " & DecryptedValue & " WHY AM I BEING STRIPPED???")

Проблема в том, что все после DecryptedValue удаляется из строки.

Ниже приведен полный пример проекта/формы, который показывает возникновение этой проблемы:

Imports System.Text
Imports System.Security.Cryptography
Imports System.IO

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim DecryptedValue As String = Decrypt("mDnz8JVmfUyYxkgZYYiFbw==", "IXZOfRxCtb4pQcu2")
        MessageBox.Show("TEST 1: " & DecryptedValue & " WHY AM I BEING STRIPPED???")

        Dim sw As New StringWriter
        sw.Write("TEST 2 ")
        sw.Write(DecryptedValue)
        sw.Write("WHY AM I BEING STRIPPED???")
        MessageBox.Show(sw.ToString())

        Dim okstr As String = "Ok"
        MessageBox.Show("When Anything " & "Else " & "Works " & okstr)
    End Sub

    Friend Function Decrypt(ByVal str As String, ByVal key As String) As String
        Dim cipher As Byte() = Convert.FromBase64String(str)
        Dim btKey As Byte() = Encoding.ASCII.GetBytes(key)
        Dim decryptor As ICryptoTransform = New RijndaelManaged() With { _
            .Mode = CipherMode.ECB, _
            .Padding = PaddingMode.None _
        }.CreateDecryptor(btKey, Nothing)
        Dim ms As New MemoryStream(cipher)
        Dim cs As New CryptoStream(ms, decryptor, CryptoStreamMode.Read)
        Dim plain As Byte() = New Byte(cipher.Length - 1) {}
        Dim count As Integer = cs.Read(plain, 0, plain.Length)
        ms.Close()
        cs.Close()
        Return Encoding.UTF8.GetString(plain, 0, count)
    End Function

End Class

Кто-нибудь сталкивался с этой проблемой в прошлом / может заметить что-то действительно простое, что я просматриваю?


person Chris    schedule 04.08.2014    source источник
comment
Вы проверили нулевой символ в конце расшифрованной строки?   -  person Grim    schedule 04.08.2014
comment
это текст расшифровывается? убедитесь, что возвращаемая строка не содержит Chr(0), который является символом завершения строки.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 04.08.2014
comment
@ Plutonix - В точку, большое спасибо, напишите как ответ, я приму :)   -  person Chris    schedule 04.08.2014
comment
Кхм. Привет! ‹машет руками в воздухе›. Я тоже это заметил!   -  person Grim    schedule 04.08.2014
comment
Извините, Грим, по какой-то причине я мог видеть только частичный ответ... заранее, но теперь все выглядит нормально. Большое спасибо за вашу помощь :)   -  person Chris    schedule 04.08.2014
comment
Если это текст, удалите 00 символ из строки перед объединением (во время отправки?), в противном случае напечатайте шестнадцатеричные числа двоичного результата.   -  person Maarten Bodewes    schedule 04.08.2014


Ответы (1)


Если расшифрованный возврат включает в себя Null (Chr(0)) мало кто «увидит» добавленный текст. Это связано с тем, что Chr(0)/Null является символом завершения строки.

Dim sb As New StringBuilder

sb.Append("first part of string" & Convert.ToChar(0))
sb.Append("this is added")

Console.WriteLine(sb.ToString)
Console.WriteLine(sb.ToString.Length)

Отображается только первая часть, но длина будет равна 34, что также включает встроенный нуль. Созданная строка на самом деле имеет длину 34 символа, но почти все останавливается на Chr(0).

Консоль даже не увидит новую строку, которая отправляется после всей строки, поэтому отображается:

first part of string34

Для получения дополнительной информации о том, как и почему это работает, см. этот ответ

person Ňɏssa Pøngjǣrdenlarp    schedule 04.08.2014