【问题标题】:Adding a numerical value to a byte?向字节添加数值?
【发布时间】:2010-01-15 02:43:07
【问题描述】:
public void EncryptFile()
    {            
        OpenFileDialog dialog = new OpenFileDialog();
        dialog.Filter = "JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|All files (*.*)|*.*";
        dialog.InitialDirectory = @"C:\";
        dialog.Title = "Please select an image file to encrypt.";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            byte[] ImageBytes = File.ReadAllBytes(dialog.FileName);

            foreach (byte X in ImageBytes)
            {
                //How can I take byte "X" and add a numerical value to it?
            }
        }             
    }

所以,我试图通过将图像文件转换为 byte[] 数组,然后为每个字节添加一个数值来加密图像文件。

如何向字节添加数值?

【问题讨论】:

    标签: c# encryption arrays byte


    【解决方案1】:

    您只需添加它。问题是您不能在那里修改 foreach 循环中的值。你实际上想要一个 for 循环:

    for(int k = 0; k < ImagesBytes.Length; k++){
       ImageBytes[k] = (byte) (ImageBytes[k] + 5); // needs a cast
    }
    

    【讨论】:

    • itowlson:实际上,它会愉快地溢出(不会崩溃)。
    • Papuccino1: zneak else 在下面解释了它,但基本上,你不能分配给 foreach 变量(这是特别不允许的)。尽管如此,您通常不能在 foreach 语句中修改您正在循环的对象。如果你想修改(即设置数组的一个元素),典型的 for 循环(或一些变体)是合适的。
    • Hot diggity,它会的。很抱歉!
    【解决方案2】:

    byte 是一个值类型,这意味着它在返回时总是被复制。因此,您只能将值添加到 foreach 内的本地字节值,就像在函数内更改 byte 参数的值不会更改函数外的值一样(当然,除非您使用了ref 关键字)。

    您不能将foreach 用于此任务。使用常规的for 循环:

    for(int i = 0; i < ImageBytes.Length; i++)
        ImageBytes[i] += MyNumericValue;
    

    【讨论】:

    • 我还想说,给一个字节加一个值来加密比加密更容易混淆。
    【解决方案3】:

    你需要使用(特别是模256)加法,这样操作是可逆的。或者,您可以使用按位运算,XOR 是一种常见的选择。

    模256运算对于字节的实现很简单,你只需要将结果转换为:

    ImageBytes[k] = (unsigned byte) ((unsigned byte) ImageBytes[k] + x)
    

    但请注意,这种“加密”相当弱。提高这种加密强度的一种方法是为每个字节添加一个不同的值,例如通过在循环缓冲区中获取添加的值(即使用最终重复自身的序列)。更好的方法,仍然可以使用容易解码的值作为操作数的一部分。

    【讨论】:

    • 非常感谢您的提示。当我完成第 1 步时,我一定会实现这样的事情。在盒子上切一个洞。转到第 2 步。
    【解决方案4】:

    问题:为什么不只使用 .NET 中的一种内置加密流?

    如果你不想这样做,假设你想在隐藏图像的位之后以某种方式使用图像,我会考虑做一个自定义流类并只修改字节是进来吧。

    这里有一个很好的端到端遍历Custom Transform Streams(旋转流将是解决图像文件模糊问题的更好更快的方法)。这也消除了添加到字节的溢出问题。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-14
      相关资源
      最近更新 更多