如何快速解码(移位和xoring)大规模字节数组?

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)

编辑:我发现真正的性能问题是显示文本.阅读+解码非常快.

Jon*_*eet 7

一种可能的优化方法是预先计算任何输入字节的输出.所以你有:

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编码一样.