在字节中添加数值?

时间:2010-01-15 02:43:07

标签: c# encryption arrays byte

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 []数组然后为每个字节添加一个数值来加密图像文件。

如何将数值添加到字节?

4 个答案:

答案 0 :(得分:2)

你只需添加它。问题是你不能修改foreach循环中的值。你真的想要一个for循环:

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

答案 1 :(得分:0)

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

您无法使用foreach执行此任务。使用常规for循环:

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

答案 2 :(得分:0)

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

模数256操作很容易实现字节,你只需要转换结果,如:

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

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

答案 3 :(得分:0)

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

如果您不想这样做,假设您想要在隐藏它的位之后以某种方式使用图像,我会看一下自定义流类,只修改字节是进来。

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