Строка от массива байтов не становится обрезанной в C#?

Вот некоторый злой код, который Вы могли бы найти интересным. :D

public enum YesNo {YES, NO}

public static void main(String... args) throws Exception {
    Field field = Unsafe.class.getDeclaredField("theUnsafe");
    field.setAccessible(true);
    Unsafe unsafe = (Unsafe) field.get(null);
    YesNo yesNo = (YesNo) unsafe.allocateInstance(YesNo.class);

    Field name = Enum.class.getDeclaredField("name");
    name.setAccessible(true);
    name.set(yesNo, "YES");

    Field ordinal = Enum.class.getDeclaredField("ordinal");
    ordinal.setAccessible(true);
    ordinal.set(yesNo, 0);

    System.out.println("yesNo " + yesNo);
    System.out.println("YesNo.YES.name().equals(yesNo.name()) "+YesNo.YES.name().equals(yesNo.name()));
    System.out.println("YesNo.YES.ordinal() == yesNo.ordinal() "+(YesNo.YES.ordinal() == yesNo.ordinal()));
    System.out.println("YesNo.YES.equals(yesNo) "+YesNo.YES.equals(yesNo));
    System.out.println("YesNo.YES == yesNo " + (YesNo.YES == yesNo));
}
22
задан Lazlo 9 September 2009 в 23:11
поделиться

3 ответа

Чтобы исправить это, необходимо выполнить TrimEnd (new char [] {(char) 0}); . Это не пробелы - это на самом деле странным образом преобразованные нулевые символы. У меня тоже была эта проблема.

32
ответ дан 29 November 2019 в 03:44
поделиться

На самом деле это не пробелы:

System.Text.Encoding.ASCII.GetString(byteArray).TrimEnd('\0')

... должно помочь.

-Oisin

22
ответ дан 29 November 2019 в 03:44
поделиться

Обрезка по умолчанию удаляет только пробелы , где пробелы определяются char.IsWhitespace .

'\ 0' - это управляющий символ, а не пробел.

Вы можете указать, какие символы обрезать, используя перегрузку Trim (char []) :

string result = Encoding.ASCII.GetString(data).Trim(new char[] { '\0' });
8
ответ дан 29 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: