【问题标题】:Byte array replace byte with byte sequence efficiency: iterate and copy versus SelectMany字节数组用字节序列效率替换字节:迭代和复制与 SelectMany
【发布时间】:2011-10-08 16:31:49
【问题描述】:

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

  1. 将整个内容解码为 ASCII 字符串,然后使用String.Replace() 换出我想要的内容。这样做的问题是字符似乎只是被解码为不可打印的框字符或问号,从而丢失了它们的实际字节值。
  2. 遍历字节数组以查找我的任何控制字符并执行数组插入操作(创建更大的新数组、复制现有片段、写入新片段)。
  3. 使用Array.ToList<byte>() 将字节数组转换为List,然后使用IEnumerable.SelectMany() 将控制字符转换为可读字符序列,然后SelectMany 将为我变平。

所以问题是,就效率而言,哪个是最佳选择?我对IEnumerable lambda 操作的性能影响并没有很好的感觉。我相信选项 1 在功能上不可行,但我可能是错的。

【问题讨论】:

    标签: c# arrays lambda performance ienumerable


    【解决方案1】:

    试试

    // 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 字节的字节数组”……这是 fastet+最适合我们的用例(1 MB - 1 GB 文件)。

    【讨论】:

    • 这是我上面描述的解决方案 1。我仍然不相信这对于不可打印的 ASCII 字符会可靠地工作,但假设它确实如此,它是最有效的方法吗?如果有,为什么?
    • ASCII 不可打印字符 0x01 - 0x20 不会被这种方法改变 - 我们经常使用它并彻底检查它......文档指出它至少对于 7Bits 是干净的......根据我们的经验,我们从来没有遇到过 8 位字符的问题...我为 8 位值添加了一个示例替换...
    猜你喜欢
    • 2016-09-10
    • 2013-03-25
    • 2013-06-09
    • 1970-01-01
    • 2015-03-19
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多