C# 向字节添加数值?

C# 向字节添加数值?,c#,encryption,arrays,byte,C#,Encryption,Arrays,Byte,因此,我试图通过将图像文件转换为byte[]数组,然后为每个字节添加一个数值来加密图像文件 如何向字节中添加数值?您只需添加它即可。问题是,您不能在那里修改foreach循环中的值。实际上,您需要一个for循环: public void EncryptFile() { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "JPEG Files (*.jpeg)|

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


如何向字节中添加数值?

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

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?
            }
        }             
    }
for(int k=0;k
字节
是一种值类型,这意味着它在返回时总是被复制。因此,您只能在
foreach
中的本地字节值中添加一个值,就像在函数中更改
byte
参数的值不会更改函数外的值一样(当然,除非您使用了
ref
关键字)

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

for(int k = 0; k < ImagesBytes.Length; k++){
   ImageBytes[k] = (byte) (ImageBytes[k] + 5); // needs a cast
}
for(int i=0;i
您需要使用模(特别是模256)加法,以便操作是可逆的。或者,您可以使用按位操作,XOR是常见的选择

对于字节,模256操作很容易实现,您只需强制转换结果,如所示:

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

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

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

如果您不想这样做,假设您在模糊了图像的各个部分之后想要以某种方式使用图像,我将考虑执行一个自定义流类,只需修改输入的字节


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

我还想说,添加一个值到字节以进行加密比加密更容易混淆。itowlson:实际上,它只会溢出(不会崩溃)。Papuccino1:zneak else在下面解释了这一点,但基本上,您不能为foreach变量赋值(这是特别不允许的)。尽管如此,您通常不能在foreach语句中修改正在循环的对象。如果要修改(即设置数组的元素)典型的for循环(或某些变体)是适当的。热数字,所以它会。抱歉!非常感谢你的提示。当我完成步骤1时,我一定会执行类似的操作。在盒子上切一个洞。转到步骤2。
ImageBytes[k] = (unsigned byte) ((unsigned byte) ImageBytes[k] + x)