почему символ 0x00 заставляет System.Diagnostics.Debug.WriteLine не писать новую строку? - PullRequest
2 голосов
/ 29 июля 2011
Dim hex = "41"
    Dim text As New System.Text.StringBuilder
    For i As Integer = 0 To hex.Length - 2 Step 2
        text.Append(Chr(Convert.ToByte(hex.Substring(i, 2), 16)))
    Next
    System.Diagnostics.Debug.WriteLine(text.ToString)

работает отлично .. System.Diagnostics.Debug.WriteLine записывает сам вывод в новую строку.

 Dim hex = "4100"
    Dim text As New System.Text.StringBuilder
    For i As Integer = 0 To hex.Length - 2 Step 2
        text.Append(Chr(Convert.ToByte(hex.Substring(i, 2), 16)))
    Next
    System.Diagnostics.Debug.WriteLine(text.ToString)

но все же это не удается .. (сам вывод не в новой строке), чем это объясняется?

Из того, что я знаю, System.Diagnostics.Debug.Writeline делает что-то похожее на это:

System.Diagnostics.Debug.Write(input)
System.Diagnostics.Debug.Write("\n")

так что независимо от моего ввода у него всегда должен быть символ новой строки, даже если в моем входе есть завершающий символ 00?

Ответы [ 3 ]

3 голосов
/ 29 июля 2011

Я подозреваю, что это не Debug.WriteLine сам по себе - это элемент управления Windows, который получает вывод, который обрабатывает U + 0000 как "конец строки".

Попробуйте добавить запись TextWriterTraceListener в файл в коллекцию прослушивателей Debug, затем посмотрите на файл в программе просмотра двоичных файлов, и я подозреваю, что вы увидите все символы, которые, как вы думали, вы писали.

2 голосов
/ 29 июля 2011

Вот подробности, описывающие, что здесь происходит:

Класс string в .net представляет собой массив char, начинающийся с указателя на первый char в массиве и заканчивающийся наспециальный «терминал» char \0.Когда вы конвертируете 00 в байт, вы получаете 0.но 0 просто равно символу терминала \0

byte b = (byte)`\0`;\\the value of b will be 0

Так что Console.Write будет игнорировать все символы после первого \0 !.Так будет смотреть не только консоль, но и компоненты управления.например, textBox.Text, если вы примените к нему строку, имеющую символ \0, он не будет отображать никаких символов после \0 «включая сам \0».

Edit:

Из того, что я знаю, System.Diagnostics.Debug.Writeline делает что-то похожее на это:

System.Diagnostics.Debug.Write(input)
System.Diagnostics.Debug.Write("\n")

Iдогадывается, что Debug.WriteLine не реализованы таким образом, иначе мы не заметим такого поведения.возможно, он объединяет строку с новой строкой, например input + "\n".

Я могу диагностировать Console.WriteLine с помощью программы Resharper.код:

[SecuritySafeCritical]
public virtual void WriteLine(string value)
{
    if (value == null)
    {
        this.WriteLine();
    }
    else
    {
        int length = value.Length;
        int num2 = this.CoreNewLine.Length;
        char[] destination = new char[length + num2];
        value.CopyTo(0, destination, 0, length);
        switch (num2)
        {
            case 2:
                destination[length] = this.CoreNewLine[0];
                destination[length + 1] = this.CoreNewLine[1];
                break;

            case 1:
                destination[length] = this.CoreNewLine[0];
                break;

            default:
                Buffer.InternalBlockCopy(this.CoreNewLine, 0, destination, length * 2, num2 * 2);
                break;
        }
        this.Write(destination, 0, length + num2);
    }
}

Таким образом, он объединяет строковое значение с новой строкой.так что это вызовет тот же эффект.

0 голосов
/ 15 февраля 2019

Чтобы исправить это и по-прежнему отображать NULL символов, перед печатью введите .Replace("\0", @"\0") в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...