二进制写入地址

时间:2014-09-27 11:37:33

标签: c# c#-4.0

有人可以帮我把文本框中的十六进制字符串写入文件十六进制地址吗?

这是我目前的代码:

private void button1_Click(object sender, EventArgs e)
{
    BinaryWriter wr = new BinaryWriter(File.OpenWrite(listBox1.SelectedItem.ToString()));       
    for (int i = 0x83C410; i <= 0x83C417; i++)
    {
        wr.Write(textBox1.Text);
    }
    wr.Close();       
}

但是点击按钮没有任何文件发生后它就无法工作,即使它没有显示任何有点奇怪的错误。

经过几次调整,我得到了它将值保存到文件二进制文件中,但现在它添加一个额外的char idk如何。这是我现在使用的代码:

 private void button1_Click(object sender, EventArgs e)
    {
        BinaryWriter wr = new BinaryWriter(File.OpenWrite(listBox1.SelectedItem.ToString()));
        wr.BaseStream.Position = 0x83C410;
        wr.Write(textBox1.Text);
        wr.Flush();
    }

相反,添加8个字节会增加9个额外的内容,而我的文本框仅限于8个字符。 Hex添加:08736574706F777265 相反:736574706F777265 添加的ASCII:.setpowre 相反:setpowre

3 个答案:

答案 0 :(得分:2)

首先,使用FileWriters时提示一些:

  • 尽可能将它们放在using语句中,以便妥善处理。
  • 我总是建议明确调用Flush()而不是Close()。无论如何,Dispose() - 方法将关闭它,并且Closing并不总是冲洗作者。这可能是您的写入未被刷新到文件的原因。

关于代码的另一个有趣的观点是,您使用的是具有特定十六进制值的for循环,只是为文件写入相同的值(textBox1.Text)。那是为什么?

更新 - 我在flushbin上看到了你的代码,如果你不介意的话,我选择了你评论出其他一些代码的部分:

private void button1_Click(object sender, EventArgs e)
        {
#region "New"
            //byte[] bytes = new byte[str.Length * sizeof(char)];
            //System.Buffer.BlockCopy(textBox1.Text.ToCharArray(), 0, bytes, 0, bytes.Length);
            //using (FileStream fs = File.OpenWrite(listBox1.SelectedItem.ToString()))
            //{
            //    fs.Seek(0x83C410, SeekOrigin.Begin);
            //    fs.Write(bytes, 0, 7);
            //}
#endregion

            BinaryWriter wr = new BinaryWriter(File.OpenWrite(listBox1.SelectedItem.ToString()));
            textBox8.Text = ConvertToHex(Encoding.UTF8.GetBytes(textBox8.Text));
            for (int i = 0x83C410; i <= 0x83C417; i++)
            {

               // wr.Write(textBox1.Text);
            }
            wr.Close();
        }

关于使用using语句并明确调用Flush()的观点仍然存在,但是现在我看到当你读取文件时,你正在使用for循环的十六进制值确定要读取的字节的流位置,所以我猜你不应该忘记在字节时使用这些数字来显式设置流位置:

wr.BaseStream.Position = i;

另一个区别是你正在读取字节的字节,而你正在一次写入整个字符串,所以你要么在写方法中不需要for-loop,要么你应该改变你的代码来写字节为字节也是。

答案 1 :(得分:0)

由于Listbox.SelectedItemObjectToString()方法可能不会返回您希望它返回的值。试试这个;

string selected = listBox1.GetItemText(listBox1.SelectedValue);
BinaryWriter bw = new BinaryWriter(File.OpenWrite(selected));

答案 2 :(得分:0)

private void button1_Click(object sender, EventArgs e)
        {
            BinaryWriter wr = new BinaryWriter(File.OpenWrite(listBox1.SelectedItem.ToString()));
            wr.BaseStream.Position = 0x83C410;
            wr.Write(System.Text.Encoding.UTF8.GetBytes(textBox1.Text));
            wr.Close();
        }

这是我的问题的答案。