字节数组用字节序列替换字节效率:迭代和复制相对于SelectMany
本文关键字:字节 迭代 复制 SelectMany 相对于 替换 数组 字节数 效率 | 更新日期: 2023-09-27 18:02:44
我正在处理一个包含文本消息的字节数组,但是消息中的一些字符是控制字符(即小于0x20),我想用解码为ASCII时人类可读的字符序列替换它们(例如0x0F
将显示[TAB]
而不是实际上是一个制表符)。因此,正如我所看到的,我有三个选项:
- 解码整个事情成一个ASCII字符串,然后使用
String.Replace()
交换出我想要的。这样做的问题是,字符似乎只是被解码为不可打印的方框字符或问号,从而失去了它们实际的字节值。 - 遍历字节数组寻找任何我的控制字符,并执行数组插入操作(创建新的更大的数组,复制现有的片段,写入新的片段)。
- 使用
Array.ToList<byte>()
将字节数组转换为List
,然后使用IEnumerable.SelectMany()
将控制字符转换为可读字符序列,然后SelectMany
将为我平整。
那么问题是,就效率而言,哪一个是最好的选择?我对IEnumerable
lambda操作的性能影响并没有很好的感觉。我认为选项1在功能上是不可行的,但我可能错了。
Try
// 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字节的字节数组"……对于我们的用例(1mb - 1gb的文件),这是最快最干净的。