2012-06-03 77 views
1

我正在使用以下代碼將寫入txt文件的十六進制字符串轉換爲 字節文件。問題是它不處理大的txt文件,我得到「內存不足異常」 。我知道它應該在「塊」中完成,但我不能 正確。十六進制爲字節塊

請幫忙!代碼:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    { 
     string tempFileName = (Server.MapPath("~\\Tempfolder\\" + FileUpload2.FileName)); 

     using (FileStream fs = new FileStream(tempFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
     using (StreamReader sr = new StreamReader(fs)) 
     { 

      string s = (sr.ReadToEnd()); 
      if (s.Length % 2 == 1) { lblispis.Text = "String must have an even length"; } 
      else 
      { 
       string hexString = s; 
       File.WriteAllBytes(tempFileName + ".bin", StringToByteArray(hexString)); 
       lblispis.Text = "Done."; 
      } 
     } 
    }        
} 
public static byte[] StringToByteArray(String hex) 
{ 
    int NumberChars = hex.Length; 
    byte[] bytes = new byte[NumberChars/2]; 
    for (int i = 0; i < NumberChars; i += 2) 
     bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    return bytes; 
} 

回答

2

您可以用ReadLine更換ReadToEnd呼叫,敷在一個循環中,如果文件格式允許。

如果不是這種情況,那麼總是可以選擇讀取偶數個字符(Read(char[], int, int)),直到達到文件末尾。當然,這樣做後,你已經完成了一些工作很晚才檢測出不平衡的字符數。

+0

+1,這基本上它。 – Groo

1

要添加到@ Wormbo的答案,請注意,十六進制字符串只包含字節數組的兩倍的字符。在.NET中,對象大小限制爲2GB(2GB實際上是32位機器上的進程大小限制),但由於堆碎片,您可能很容易分配甚至〜800MB連續塊。

換句話說,你會希望直接寫入到磁盤,轉換後立即:

using (StreamReader reader = new StreamReader(hex)) 
using (BinaryWriter writer = new BinaryWriter(File.Open(bin, FileMode.Create))) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
     writer.Write(StringToByteArray(line)); 
} 

[編輯]

我已經固定它,括號必須添加周圍作業(檢查上面的while聲明)。

請注意,這只是像一個速記:

 string line = reader.ReadLine(); 
    while (line != null) 
    { 
      writer.Write(...); 
      line = reader.ReadLine(); 
    } 
+0

while(line = reader.ReadLine()!= null) 「不能隱式地將類型字符串轉換爲bool」 –

+0

如果我這樣做:string line = reader.ReadLine(); (reader.ReadLine()!= null) Writer.Write(StringToByteArray(line)); }我得到空文件。 –

+0

@拉迪斯拉夫:對不起,我沒有檢查就寫了。它基本上是一行中的兩個操作:1)將一行讀入'line'變量,並且2)檢查「行」是否爲空。但後面的操作有優先權,所以編譯器試圖將一個布爾值賦給'line'變量。我會編輯。 – Groo