2014-09-27 115 views
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();  
} 

但之後,我按一下按鈕沒有任何反應到文件,即使它並沒有顯示這是有點怪任何錯誤這是行不通的。

經過一些調整,我得到它的工作節省值文件二進制文件,但現在它增加了一個額外的字符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加1,我的文本框限制爲8個字符。 十六進制,增加了:08736574706F777265 相反:736574706F777265 ASCII,增加了:.setpowre 相反:setpowre

+0

我不明白。你想將整數轉換爲十六進制,然後保存嗎? – 2014-09-27 11:48:38

+0

當代碼完全無法做到目標時,很難猜測它的意圖。起點是FileStream.Seek()和Encoding.GetBytes()。 – 2014-09-27 11:49:10

+0

如果在創建'BinaryWriter'時添加'FileMode.Create'作爲第二個參數會怎麼樣? – 2014-09-27 11:51:11

回答

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(); 
     } 

這是我的問題的答案。

0

由於Listbox.SelectedItemObject,該ToString()方法可能不會返回你想要它,它返回的值。試試這個;

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

他正在嘗試從文本框,而不是列表框中讀取和寫入值:) – 2014-09-27 12:05:33

+0

他正在從我計算的列表框中選擇文件。無論是他的命名技巧都很糟糕。 – 2014-09-27 12:07:04

+0

它現在下降錯誤,'不能從'字符串'轉換爲'System.IO.Stream''。 我認爲問題出在: 'for(int i = 0x83C410; i <= 0x83C417; i ++) wr.Write(textBox1.Text); }' 那麼如果有人有解決方案嗎? – user3385780 2014-09-27 12:07:18

2
使用FileWriters時

首先,一些提示:

  • 始終把他們使用語句時可能範圍內,所以他們得到妥善處置。
  • 我總是建議明確地呼叫Flush()而不是Close()。無論如何,Dispose()-方法無論如何都會關閉它,關閉並不總是沖洗作者。這可能是你的寫入沒有被刷新到文件的原因。

有關代碼另一個有趣的一點是,你正在使用一個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(); 
     } 

我有關使用使用語句點調用Flush()明確仍然站立,但現在我看到,當你讀取您正在使用for-loop的十六進制值來確定要讀取的字節的流位置的文件,所以我想你不應該忘記使用這些數字來明確設置流的位置,當你字節:

wr.BaseStream.Position = i; 

另一個不同之處在於,您正在讀取字節的字節,而您正在一次性寫入整個字符串,因此您不需要在寫入方法中使用for循環,或者應該將代碼更改爲也爲字節寫字節。

+0

我有8個值,我從文件讀取到textbox1,textbox2 ..等 所以每個值都有其鎖定的地址,否則文件將被損壞。如果需要,我可以以某種方式顯示整個來源可能teamviewer? – user3385780 2014-09-27 12:14:08

+0

@ user3385780:你不能編輯你的帖子來顯示所有必要的代碼嗎?這會讓我們更容易回答你的問題。 :) – 2014-09-27 12:16:30

+0

它很長,很混亂:/我可以把它放在pastebin? – user3385780 2014-09-27 12:17:28