iT邦幫忙

0

VS2017 C#讀取檔案後,轉成十六進制,顯示在TextBox速度太慢

  • 分享至 

  • xImage

版上的神人大家好
小弟最近剛剛開始寫程式
遇到一個問題,在我讀取檔案後,將內部數字轉成十六進制
再將數值放到RichTextBox上
顯示出來的速度非常慢
請問有沒有其他解
註:資料數量大約有26萬筆。

private void button1_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.SelectedPath = @"D:\project\aaa.aa";
            string folderPath = folderBrowserDialog1.SelectedPath;       
            FileStream myfile = File.Open(folderPath, FileMode.OpenOrCreate,FileAccess.ReadWrite);

            BinaryReader myReader = new BinaryReader(myfile);
            int dl =System.Convert.ToInt32(myfile.Length);
            Byte[] data = myReader.ReadBytes(dl);
            label1.Text += dl;

            for (int i = 0; i < dl; i++)
            {
                richTextBox1.Text += Convert.ToString(data[i], 16);
                richTextBox1.Text += "\t";
                Application.DoEvents();
            }

            myReader.Close();
            myfile.Close();
        }

另外有一個小小的疑問,我是使用Convert.ToString(data[i], 16)的方式來轉換成十六進制
但是,給我資料的人說這個資料是十六進制的
所以一開始我直接使用richTextBox1.Text +=data[i];
顯示出來的是十進制的數字,這是何原因呢?

看更多先前的討論...收起先前的討論...
fillano iT邦超人 1 級 ‧ 2019-12-04 13:40:25 檢舉
用StringBuilder把結果處理完,然後一次把結果給richTextBox1.Text啦...
andy79512 iT邦新手 5 級 ‧ 2019-12-04 15:55:42 檢舉
謝謝大大的解答,我最後使用
string[] a = new string[dl];
for (int i = 0; i < dl; i++)
{
a[i] = Convert.ToString(data[i], 16);
}
string str = string.Join(" ", a);
再輸出字串,也成功了
那請問fillano大大
用string以及stringBuilder 會有差嗎?
小魚 iT邦大師 1 級 ‧ 2019-12-05 09:09:34 檢舉
這問題我已經回答你了
andy79512 iT邦新手 5 級 ‧ 2019-12-05 10:14:23 檢舉
了解,感謝解答
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2019-12-04 15:12:52

改善速度提出以下兩個做法(可同時使用)
A.fillano 大大的 StringBuilder (A1做法)
如下標註為 A 的程式碼,其中
A1 是「先全部組好字串,最後再一次顯示在 TextBox 上」
A2 是「持續組字串,每加一個就更新原本的 TextBox」
A1 會比 A2 快很多

B.以查表取代原 Convert.ToString
如下標註為 B 的程式碼
如要使用
String[] table 你要自己加到 "FE","FF"}; 為止

至於 data[i] 到底是10進制還是16進制
請看 Byte[] data 宣告初值那列
data[] 是 0, 15, 14 (數值就是數值)
當你「用 16 進制顯示」時,會看到 0, 0F, 0E
當你「用 2 進制顯示」時,會看到 0000, 1111, 1110
而不管如何顯示
data[] 永遠是 0x00, 0x0F, 0x0E (數值就是數值)

using System;
using System.Text;
					
public class Program
{
	public static void Main()
	{
		int dl = 3;
		Byte[] data = {0x00, 15, 0x0E};
		StringBuilder sb = new StringBuilder();		//A
		String[] table = {"00","01","02","03","04","05","06","07","08","09","0A","0B","0C","0D","0E","0F"};	//B

		for (int i = 0; i < dl; i++)
		{
			sb.Append(Convert.ToString(data[i],16)).Append('\t');	//A
			//sb.Append(table[data[i]]).Append('\t');	//B
			//richTextBox1.Text += sb.ToString();	//A2
			Console.WriteLine(sb.ToString());	//A2
		}		
		//richTextBox1.Text = sb.ToString();	//A1
		Console.WriteLine(sb.ToString());	//A1
	}
}
2
小魚
iT邦大師 1 級 ‧ 2019-12-04 15:28:24

同意fillano大大的話,
你會慢主要是因為一直去改控制項的資料,
加上Application.DoEvents();也會影響效能,
應該要先把字串組好之後,
一次性地改控制項即可.

StringBuilder可以改善字串處理的速度,
雖然說以你目前的程式應該影響不大,
不過如果要處理大量的資料就會差很多,
甚至有可能遇到string無法處理的情況.

我要發表回答

立即登入回答