如何以快速方式解码(移位和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;
}
编辑:我发现真正的性能问题是显示文字。阅读+解码非常快。
答案 0 :(得分: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;
}
尽管如此,它很可能会慢于你现有的位移算法。编辑:我刚刚尝试将其与原始的bitshift进行比较,但使用的是临时局部变量:它们大致相同。
您是否对当前的表现进行了基准测试?这肯定太慢了吗?特别是,从几乎任何存储介质加载文件将比解码成本慢很多多。我刚刚在笔记本电脑上试过这个 - 对于200MB的数据,需要大约半秒钟。 (编辑:有了Marcelo的回答,它需要 半秒。)这真的太慢了吗?
您是否乐意使用多个处理器?毕竟,这是一个令人尴尬的可并行化的例行程序。如果您使用的是.NET 4,那么TPL可能会非常简单。
我应该再次强调,这个不是“加密” - 这是一种温和的混淆形式,就像用于基本HTTP身份验证的用户名/密码的base-64编码一样是
答案 1 :(得分:2)
我认为桌面驱动的方法会更快,对吗?因为它只是字节,并且没有字节取决于相邻字节,所以只有256种可能的选择,所以只需查找每一个
答案 2 :(得分:2)
您可以通过使用临时文件加快速度:
byte b = EncodedBytes[i] ^ (byte)194;
EncodedBytes[i] = (byte)((b << 4) | (b >> 4));
使用unsafe
和原始指针可以进一步加快速度,从而避免检查访问(尽管我不知道这是否是当前JIT优化器的考虑因素)。
答案 3 :(得分:0)
要考虑的一种方法是对数据进行解码,就像它正在显示一样。也就是说,一次只解码一部分。但我怀疑你只是将数据转储到编辑控件或其他东西,这实际上不会成为一个选项。你是如何显示数据的?
除此之外,我不确定你是如何加速它的。
答案 4 :(得分:0)
如果没有.NET,您可以一次解码4个字节,但实际上,您可以做的唯一一件事就是预先计算转换表。
答案 5 :(得分:0)
那不是xor,那是shift
和or
...
在汇编中,这将是一个“旋转4字节”指令。
BTW你不能按需解码吗?在流式传输文件时,以块为单位解码文件。