обрезать гекс с конца строки - PullRequest
1 голос
/ 01 февраля 2012

У меня есть байтовый массив, который был инициализирован с 0xFF в каждом байте:

for (int i = 0; i < buffer.Length; i++)
{
    buffer[i] = 0xFF;
}

Как только этот байтовый массив был заполнен допустимыми данными, мне нужно извлечь строку ASCII, которая хранится по смещению 192 иможет быть длиной до 32 символов.Я делаю это так:

ASCIIEncoding enc = new ASCIIEncoding();
stringToRead = enc.GetString(buffer, 192, 32);

Это работает, но мне нужно удалить конечные байты, которые содержат 0xFF, чтобы строка не выглядела как "Джон Смит ??????????????????????».Есть ли в .NET функция, обеспечивающая эту возможность?Возможно, что-то вроде функции String.TrimEnd () или я ищу регулярное выражение для этого?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2012

Я бы предложил просто выяснить, как долго строка будет действительно :

int firstFF = Array.IndexOf(buffer, (byte) 0xff, 192);
if (firstFF == -1)
{
    firstFF = buffer.Length;
}
stringToRead = Encoding.ASCII(buffer, 192, firstFF - 192);

Я бы не попытался бы выдать Encoding.ASCII байтов, которые нетневерный ASCII-кодированный текст.Я не знаю от руки , что это будет с ними делать, - я подозреваю, что он конвертирует их в ?, чтобы показать ошибку (как предполагает ваш существующий вывод), но тогда вы не сможетесказать разницу между этим и реальными вопросительными знаками.Например:

byte[] data = { 0x41, 0x42, 0x43, 0xff, 0xff };
string text = Encoding.ASCII.GetString(data);
Console.WriteLine(text.Contains((char) 0xff)); // False
Console.WriteLine(text.TrimEnd((char) 0xff).Length); // Still 5...

Теперь вы могли бы создать кодировку, в которой использовался какой-нибудь символ замены, отличный от ASCII ... но это очень хлопотно, когда вы можете просто найти, где находится двоичные данные перестают быть действительными.

1 голос
/ 01 февраля 2012
var s = "Whatever" + new String((Char)0xFF, 32);
var trimmed = s.TrimEnd((Char)0xFF);

В качестве альтернативы вы можете отсканировать строку на предмет первого индекса символа, а затем взять подстроку:

var index = s.IndexOf((Char)0xFF);
var trimmed = s.Substring(0, index);
...