Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何快速解码(移位和异或)海量字节数组?_C#_Performance_Byte_Decode - Fatal编程技术网

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

在组装中,这将是一个单一的“腐烂”