字节数组用字节序列效率替换字节:迭代和复制与SelectMany

时间:2011-07-19 16:11:35

标签: c# arrays lambda performance ienumerable

我正在处理一个包含文本消息的字节数组,但是消息中的一些字符是控制字符(即小于0x20),我想用解码时人类可读的字符序列替换它们到ASCII(例如0x0F将显示[TAB]而不是实际上是制表符。所以我看到它,我有三个选择:

  1. 将整个内容解码为ASCII字符串,然后使用String.Replace()换出我想要的内容。这个问题是,字符似乎只是被解码为不可打印的盒子字符或问号,从而失去了它们的实际字节值。
  2. 遍历字节数组,查找我的任何控制字符并执行数组插入操作(制作新的大型数组,复制现有部分,编写新部分)。
  3. 使用Array.ToList<byte>()将字节数组转换为List,然后使用IEnumerable.SelectMany()将控制字符转换为可读字符序列,SelectMany然后将其展平对我来说。
  4. 所以问题是,哪个是效率方面的最佳选择?我对IEnumerable lambda操作的性能影响并没有很好的感觉。我认为选项1在功能上是不可行的,但我可能是错的。

1 个答案:

答案 0 :(得分:0)

尝试

// 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 MB - 1 GB文件)。