C# 如何快速解码(移位和异或)海量字节数组?
如何快速解码(移位和异或)海量字节数组? 我需要一个文件查看器应用程序,打开归档文件,解码里面的文件,并显示给用户。这些文件用字节移位和异或系统加密。我不可能改变算法。目前,我只是读取所有字节,然后对它们运行解码功能 我当前使用的解码功能:C# 如何快速解码(移位和异或)海量字节数组?,c#,performance,byte,decode,C#,Performance,Byte,Decode,如何快速解码(移位和异或)海量字节数组? 我需要一个文件查看器应用程序,打开归档文件,解码里面的文件,并显示给用户。这些文件用字节移位和异或系统加密。我不可能改变算法。目前,我只是读取所有字节,然后对它们运行解码功能 我当前使用的解码功能: byte[] DecodeVOQ(byte[] EncodedBytes) { for (int i = 0; i < EncodedBytes.Length; i++) { En
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;
}
byte[]DecodeVOQ(byte[]EncodedBytes)
{
for(int i=0;i4));
}
返回编码字节;
}
编辑:我发现真正的性能问题在于显示文本。读取+解码相当快。一种可能的优化方法是预计算任何输入字节的输出。所以你会:
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;
}
private static byte[]DecodedBytes=precomputerdecodedbytes();
公共静态字节[]解码VOQ(字节[]数据)
{
for(int i=0;i
不过,这很可能比现有的位移位算法要慢。编辑:我刚刚尝试将其与原始的位移位进行比较,但使用了一个临时局部变量:它们大致相同
您是否对当前的绩效进行了基准测试?是不是太慢了?特别是,从几乎任何存储介质加载文件都要比解码成本慢得多。我刚刚在我的笔记本电脑上试过——对于200MB的数据,大约需要半秒钟。(编辑:马塞洛的回答不到半秒钟。)这真的太慢了吗
您愿意使用多个处理器吗?毕竟,这是一个令人尴尬的并行化例程。如果您使用的是.NET4,TPL很可能会让这变得非常简单
我应该再次强调,这不是“加密”——这是一种轻微的混淆形式,就像基本HTTP身份验证的用户名/密码的base-64编码一样。一种可能的优化是预计算任何输入字节的输出。所以你会:
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;
}
private static byte[]DecodedBytes=precomputerdecodedbytes();
公共静态字节[]解码VOQ(字节[]数据)
{
for(int i=0;i
不过,这很可能比现有的位移位算法要慢。编辑:我刚刚尝试将其与原始的位移位进行比较,但使用了一个临时局部变量:它们大致相同
您是否对当前的绩效进行了基准测试?是不是太慢了?特别是,从几乎任何存储介质加载文件都要比解码成本慢得多。我刚刚在我的笔记本电脑上试过——对于200MB的数据,大约需要半秒钟。(编辑:马塞洛的回答不到半秒钟。)这真的太慢了吗
您愿意使用多个处理器吗?毕竟,这是一个令人尴尬的并行化例程。如果您使用的是.NET4,TPL很可能会让这变得非常简单
我应该再次强调,这不是“加密”——这是一种轻微的混淆形式,就像基本HTTP身份验证的用户名/密码的base-64编码一样。我认为表驱动的方法会更快,对吗?因为它只是字节,并且没有字节依赖于相邻的字节,所以只有256个可能的选择,所以只需查找每一个,我认为表驱动的方法会更快,对吗?因为它只是字节,没有字节依赖于相邻的字节,所以只有256种可能的选择,所以只需查找每一个,就可以通过使用临时:
byte b = EncodedBytes[i] ^ (byte)194;
EncodedBytes[i] = (byte)((b << 4) | (b >> 4));
字节b=EncodedBytes[i]^(字节)194;
EncodedBytes[i]=(字节)((b>4));
通过使用
不安全的和原始指针,您可能会进一步加快速度,从而避免检查访问(尽管我不知道这是否是当前JIT优化人员考虑的问题)。您可以通过使用临时:
byte b = EncodedBytes[i] ^ (byte)194;
EncodedBytes[i] = (byte)((b << 4) | (b >> 4));
字节b=EncodedBytes[i]^(字节)194;
EncodedBytes[i]=(字节)((b>4));
你可以通过使用<代码>不安全< /COD>和原始指针来进一步加快速度,从而避免被检查的访问(虽然我不知道这是否是当前JIT优化器的考虑)。
< P>一种考虑的方法是像正在显示的那样对数据进行解码。也就是说,一次只解码一部分。但我怀疑您只是将数据转储到编辑控件或其他什么东西,而这并不是一个真正的选项。如何显示数据
除此之外,我不确定你怎么会加快速度。 < P>一种考虑的方法是解码数据,就像正在显示的数据一样。也就是说,一次只解码一部分。但我怀疑您只是将数据转储到编辑控件或其他什么东西,而这并不是一个真正的选项。如何显示数据
除此之外,我不知道你如何加快速度。没有.NET,你可以一次解码这4个字节,但实际上,在这里,你唯一能做的就是预计算翻译表。没有.NET,你可以一次解码这4个字节,但实际上,你能做的唯一一件事就是预先计算翻译表。那不是异或,那是shift
和或
在汇编中,这将是一条“按4旋转字节”指令
顺便说一句,你不能按需解码吗?在流式处理文件时,将文件分块解码。这不是异或,而是shift
和或
在组装中,这将是一个单一的“腐烂”