les*_*rid 1 c# performance byte decode
如何快速解码(移位和xoring)大规模字节数组?我需要它用于文件查看器应用程序,该应用程序打开存档文件并解码内部文件并将其显示给用户.文件使用字节移位和xoring系统加密.我不可能改变算法.目前,我只读取所有字节,然后对它们运行Decode函数.
我目前使用的解码功能:
byte[] DecodeVOQ(byte[] EncodedBytes)
{
for (int i = 0; i < EncodedBytes.Length; i++)
{
EncodedBytes[i] ^= (byte)194;
EncodedBytes[i] = (byte)((EncodedBytes[i] << 4) | (EncodedBytes[i] >> 4));
}
return EncodedBytes;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发现真正的性能问题是显示文本.阅读+解码非常快.
一种可能的优化方法是预先计算任何输入字节的输出.所以你有:
private static byte[] DecodedBytes = PrecomputeDecodedBytes();
public static byte[] DecodeVOQ(byte[] data)
{
for (int i = 0; i < data.Length; i++)
{
data[i] = DecodedBytes[data[i]];
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,它很可能比现有的比特移位算法慢.编辑:我刚刚尝试将其与原始的bitshift进行比较,但使用的是临时局部变量:它们大致相同.
您是否对当前性能进行了基准测试?这肯定太慢了吗?特别是,从任何存储介质加载文件会更加多比解码的成本比较慢.我刚刚在笔记本电脑上试过这个 - 对于200MB的数据,需要大约半秒钟.(编辑:根据马塞洛的回答,它需要不到半秒钟.)这真的太慢了吗?
您是否乐意使用多个处理器?毕竟,这是一个令人尴尬的可并行化的例行程序.如果您使用的是.NET 4,那么TPL可能会非常简单.
我应该再次强调,虽然这不是 "加密" - 它是一种温和的混淆形式,就像基本HTTP身份验证的用户名/密码的base-64编码一样.