我有一个int key1 = -1466731422;
返回我的十六进制值62 74 93 A8
从.exe,当我在十六进制编辑器进行搜索。
我想要做的是覆盖一个newKey1
,它可以由用户作为选件,比key1
。
假设我们要覆盖key1
为int newKey1 = -1566731422
,我所做的到目前为止是:
private void btnGravar_Click(object sender, EventArgs e)
{
FixHex(key1, newKey1); //transform the int key in hex string
br = new BinaryReader(File.OpenRead(element.FileName));
try
{
for (long i = 0; i <= br.BaseStream.Length; i++)
{
if (br.BaseStream.ReadByte() == (byte)Convert.ToInt32(key1, 16))
{
progressBar.Value = progressBar.Maximum;
br.Close();
bw = new BinaryWriter(File.OpenWrite(element.FileName));
bw.BaseStream.Position = i;
bw.Write(newKey1);
bw.Close();
MessageBox.Show("Key updated", "Success");
break;
}
else
{
progressBar.Value += 1;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
它没有工作,寿。我for
循环不会找到匹配,所以我认为它会解决它的发现由int key
地址的方法(因为在十六进制编辑器,我可以做到这一点),或在字符串格式的十六进制。
BinaryReader
重载需要一个Int32
值,看它是否符合你所寻求的一个整数。BinaryReader.ReadInt32()前进4个字节流的位置,所以需要保持读取位置的轨迹,由1递增它针对每一读取和手动设置BaseStream
位置。
使用FileAccess.ReadWrite
和FileShare.ReadWrite
为BinaryReader
和BinaryWriter
两个,你可以找到价值,并一气呵成覆盖它:
注意:有没有办法来验证一个可能的假阳性这里,由于缺乏上的文件结构信息的。随你(由你决定。
int valOriginal = -1466731422;
int valSubstitute = -1566731422;
int valLength = BitConverter.GetBytes(valOriginal).Length;
using (var reader = new BinaryReader(
File.Open("[File Path]", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))) {
int position = 0;
while (position < (reader.BaseStream.Length - valLength))
{
reader.BaseStream.Position = position;
if (reader.ReadInt32() == valOriginal)
{
using (var writer = new BinaryWriter(
File.Open("[File Path]", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))) {
writer.BaseStream.Position = position;
writer.Write(valSubstitute);
};
break;
}
position += 1;
}
};
正如其他人所说,你不正确的方式比较正确的事情。要比较你比较事物的方式取决于你在BinaryReader在读取数据的格式与“KEY1”的类型。
在你的描述,你说“KEY1”是一个整数,但随后尝试将其转换像它的字符串。我只是要承担它的一个int。您可以发表评论,如果这是不正确的。
在文件中的数据的格式也没有从描述清楚。我会假设它是整数。如果它不是整数,添加评论。读一个整数的样子:
int testVal = br.ReadInt32();
这给你一个int和因为两者都是整数,你可以比较的整数:
if(testVal == key1)
{/*do your other stuff*/}
它可能更好地循环,而该文件未结束,而不是遍历每个字节,是这样的:
while(br.BaseStream.Position != br.Basestream.Length)
将其组合在一起看起来是这样的:
while(br.BaseStream.Position != br.Basestream.Length)
{
int testVal = br.ReadInt32();
if(testVal == key1)
{/*do your other stuff*/}
}
另注:因为你“每次调用此方法new'ing的BinaryReader在和BinaryReader在处于关闭‘如果’,你可以考虑在你的BinaryReader在一个using
并宣布那里。这将确保所述BinaryReader在处于异常的情况下,妥善处理。下面的变化将允许BinaryReader在妥善处置,但仍发现任何异常(也,它的那种令人难以赶上一般例外):
try
{
using(var br = new BinaryReader(File.OpenRead(element.FileName)))
{
while(br.BaseStream.Position != br.Basestream.Length)
{
if(br.ReadInt32() == key1)
{/*do your other stuff*/}
}
}
}
catch(Exception ex)
{
}
希望帮助。