替换字节数组C#中的位

时间:2017-01-31 19:09:49

标签: c# arrays bitmap byte

我想在C#中打开一个位图文件作为字节数组,并替换该数组中的某些字节,并再次将Byte数组重写为磁盘作为位图。

我目前的方法是读入byte []数组,然后将该数组转换为列表以开始编辑单个字节。

originalBytes = File.ReadAllBytes(path);
List<byte> listBytes = new List<Byte>(originalBytes);

如何用每次用户配置/不同的字节替换数组中的每个第n个字节并重写回文件?

3 个答案:

答案 0 :(得分:3)

不需要List<byte>

customByte

替换每个第n个字节
var n = 5;
byte customByte = 0xFF;

var bytes = File.ReadAllBytes(path);

for (var i = 0; i < bytes.Length; i++)
{
    if (i%n == 0)
    {
        bytes[i] = customByte;
    }
}

File.WriteAllBytes(path, bytes);

答案 1 :(得分:2)

假设你想用相同的新字节替换每个第n个字节,你可以做这样的事情(每隔3个字节显示一次):

int n = 3;
byte newValue = 0xFF;
for (int i = n; i < listBytes.Count; i += n)
{
  listBytes[i] = newValue;
}

File.WriteAllBytes(path, listBytes.ToArray());

当然,您也可以使用花哨的LINQ表达式来实现这一点,我觉得这个表达式更难以阅读。

答案 2 :(得分:1)

从技术上讲,您可以实现以下目标:

 // ReadAllBytes returns byte[] array, we have no need in List<byte>
 byte[] data = File.ReadAllBytes(path);

 // starting from 0 - int i = 0 - will ruin BMP header which we must spare 
 // if n is small, you may want to start from 2 * n, 3 * n etc. 
 // or from some fixed offset
 for (int i = n; i < data.Length; i += n)
   data[i] = yourValue;

 File.WriteAllBytes(path, data);

请注意, Bitmap 文件有一个标题

https://en.wikipedia.org/wiki/BMP_file_format

这就是为什么我从n开始循环,而不是从0开始循环