Как избавиться от символа обратной косой черты ("\") из строки - PullRequest
3 голосов
/ 02 августа 2011

Есть ли способ, где я могу избежать символа '\' из строки?

//bit array
    BitArray b1 = new BitArray(Encoding.ASCII.GetBytes("10101010"));
    BitArray b2 = new BitArray(Encoding.ASCII.GetBytes("10101010"));

    //Say i perform XOR operation on this 
    b1 = b1.Xor(b2);

    //After the XOR oper the b1 var holds the result 
    //but i want the result to be displayed as 00000000

    //So i convert the bitarray to a byte[] and then to string 
    byte[] bResult = ToByteArray(b1);
    strOutput  = Encoding.ASCII.GetString(bResult);

выход

    The string strOutput is = "\0\0\0\0\0\0\0\0" 
    But the desired output is 00000000

где ToByteArray может быть простым методом, как этот

public static byte[] ToByteArray(BitArray bits)
        {
             byte[] ret = new byte[bits.Length / 8];
             bits.CopyTo(ret, 0);
             return ret;
        }

Альтернатива 1 : я могу игнорировать символ '\', используя регулярные выражения или string.replace

Но есть ли другой лучший способ справиться с такими сценариями?

Ответы [ 4 ]

1 голос
/ 02 августа 2011

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

Например: Вызвав дополнительный метод для вашего кода

    byte[] bResult = ToByteArray(b1);
    strOutput  = Encoding.ASCII.GetString(bResult).Replace("\\\"","");

EDIT:

Полагаю, в вашем случае мой ответ сработает, НО

0 '\0'

также находится в наборе символов ASCII (только в 0), это означает, что вам дана та же строка \ 0 \ 0 \ 0 \ 0 .. с заменой на символ обратной косой черты (\)

CALL Replace("\0","0")
1 голос
/ 02 августа 2011
    string strOutput = "\0\0\0\0\0\0\0\0" 
    string strOutput = Encoding.ASCII.GetString(strOutput).Replace("\\\"","");
0 голосов
/ 02 августа 2011

А как же

StringBuilder sb = new StringBuilder();

foreach( byte b in bResult )
{

   sb.Append( String.Format("{0:00000000}\n", b ) ;
} 

strOutput = sb.ToString ();

Я знаю, что-то другое, но я верю, что это больше, чем вы хотите! Поскольку в какой-то момент вы должны преобразовать из двоичного в символ! Если нет, вы не будете знать, является ли это двоичным нулевым значением или ascii-представлением char 0!

НТН

Mario

0 голосов
/ 02 августа 2011

Если ваш вопрос "есть ли лучший способ удалить обратную косую черту, чем использовать string.replace Я бы сказал, что ответ, как правило, нет, но это зависит от того, что вы хотите сделать.

Вы ищете грубую скорость? Как вы думаете, накладные расходы на компиляцию регулярного выражения и его применение слишком медленны? Движки Regex, как правило, довольно хорошо оптимизированы, и если вы их используете, они часто дают хорошую производительность. Вы можете взглянуть на исходный код функций «замены» в различных библиотеках, чтобы понять, как работают профессионалы.

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

...