Массив байтов заменяет байт эффективностью последовательности байтов: повторяется и копируется по сравнению с SelectMany - PullRequest
1 голос
/ 19 июля 2011

Я имею дело с байтовым массивом, который содержит текстовое сообщение, но некоторые из символов в сообщении являются управляющими символами (т. Е. Менее 0x20), и я хочу заменить их последовательностями символов, которые могут быть прочитаны человеком при декодированиив ASCII (например, 0x0F будет отображать [TAB] вместо того, чтобы фактически быть символом табуляции).Итак, на мой взгляд, у меня есть три варианта:

  1. Декодировать все это в строку ASCII, затем использовать String.Replace(), чтобы поменять то, что я хочу.Проблема в том, что символы кажутся просто декодированными как непечатаемый символ коробки или вопросительные знаки, теряя при этом их действительные значения байтов.
  2. Итерация по массиву байтов в поисках любых моих управляющих символов и выполнениеОперация вставки массива (создание нового большего массива, копирование существующих частей, запись новых частей).
  3. Используйте Array.ToList<byte>() для преобразования байтового массива в List, затем используйте IEnumerable.SelectMany() для преобразования управляющих символовв последовательности читаемых символов, которые затем сгладят для меня SelectMany.

Итак, вопрос в том, какой вариант является лучшим с точки зрения эффективности?Я не очень хорошо понимаю влияние производительности на IEnumerable лямбда-операции.Я считаю, что вариант 1 является функционально неработоспособным, но я могу ошибаться.

1 Ответ

0 голосов
/ 19 июля 2011

Попробуйте

// your byte array for the message
byte[] TheMessage = ...;
// a string representation of your message (the character 0x01... 0x32 are NOT altered)
string MessageString = Encoding.ASCII.GetString(TheMessage);
// replace whatever you want...
MessageString = MessageString.Replace (" ", "x").Replace ( "\n", " " )...
// the replaced message back as byte array
byte[] TheReplacedMessage= Encoding.ASCII.GetBytes(MessageString.ToCharArray());

РЕДАКТИРОВАТЬ:

Пример замены значения 8-битного байта

 MessageString = MessageString.Replace ( Encoding.ASCII.GetString (new byte[] {0xF7}), " " )...

Что касается производительности Я не уверен на 100%, является лисамый быстрый подход ... мы только что попробовали несколько подходов, хотя наше требование состояло в том, чтобы заменить «байтовый массив из 1-n байтов» в исходном байтовом массиве ... это оказалось самым быстрым + чистым для нашего варианта использования (1 МБ -1 ГБ файлов).

...