0

我试图在 c++ cli 中构建一个十六进制编辑器,并让它将二进制文件读取到富文本框,并将二进制文件从富文本框写入空文件。它工作正常,但阅读速度很慢,尤其是写作。有人可以告诉我如何修复此代码或更好的方法一起完成这一切。

是的,我知道 256 if 语句会减慢写入速度,但我不知道如何转换数据 system::string 以将其写出。

作者需要大约 2 分钟来写入 50kb,而读者需要大约 10 秒来读取 50kb。我认为这真的很慢

谢谢

读者

if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {

             richTextBox1->Text = "";

                 String^ datafile = openFileDialog1->FileName;

FileStream fs(datafile, FileMode::Open);

BinaryReader br(%fs);

String^ data;
String^ datatotal;

double progressBar1count = 0;
double length = fs.Length;

progressBar1->Maximum = 100;

unsigned char byte;



for (__int64 count = 0, count_max = fs.Length; count < count_max; ++count)

{

  byte = br.ReadByte();

  data = byte.ToString(L"x2");

  datatotal = datatotal + data;

  Application::DoEvents();

  progressBar1count += 1;

  progressBar1->Value = progressBar1count / length * 100;

             }

datatotal = datatotal->ToUpper();

richTextBox1->Text = datatotal;

                 }

             progressBar1->Value = 0;

作家

if (saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) {

    String^ datafile = saveFileDialog1->FileName;

String^ data = richTextBox1->Text;
double length = data->Length;

progressBar1->Maximum = 100;

int count = 0;
double countlength = 0;

string databasicstring;

fstream f(
    "C:\\users\\patchvista2\\b.exe",
    ios::out | ios::binary
    );

while (countlength < length - 1)

{

    String^ data = richTextBox1->Text;

    f.seekp(count, ios::beg );

    data = data->Substring(countlength , 2);

    count += 1;

  countlength += 2;

  progressBar1->Value = countlength / length * 100;

if (data == "00") {
     f.put(0x00);    
}

if (data == "01") {
     f.put(0x01);
}

if (data == "02") {
     f.put(0x02);
}

if (data == "03") {
     f.put(0x03);
}

if (data == "04") {
     f.put(0x04);
}

if (data == "05") {
    f.put(0x05);
}

if (data == "06") {
    f.put(0x06);
}

if (data == "07") {
    f.put(0x07);
}

if (data == "08") {
    f.put(0x08);
}

if (data == "09") {
    f.put(0x09);
}

if (data == "0A") {
    f.put(0x0A);
}

if (data == "0B") {
    f.put(0x0B);
}

if (data == "0C") {
    f.put(0x0C);
}

if (data == "0D") {
    f.put(0x0D);
}

if (data == "0E") {
    f.put(0x0E);
}

if (data == "0F") {
    f.put(0x0F);
}

if (data == "10") {
    f.put(0x10);
}

if (data == "11") {
    f.put(0x11);
}

if (data == "12") {
    f.put(0x12);
}

if (data == "13") {
    f.put(0x13);
}

if (data == "14") {
    f.put(0x14);
}

if (data == "15") {
    f.put(0x15);
}

if (data == "16") {
    f.put(0x16);
}

if (data == "17") {
    f.put(0x17);
}

if (data == "18") {
    f.put(0x18);
}

if (data == "19") {
    f.put(0x19);
}

if (data == "1A") {
    f.put(0x1A);
}

if (data == "1B") {
    f.put(0x1B);
}

if (data == "1C") {
    f.put(0x1C);
}

if (data == "1D") {
    f.put(0x1D);
}

if (data == "1E") {
    f.put(0x1E);
}

if (data == "1F") {
    f.put(0x1F);
}

if (data == "20") {
    f.put(0x20);
}

if (data == "21") {
    f.put(0x21);
}

if (data == "22") {
    f.put(0x22);
}

if (data == "23") {
    f.put(0x23);
}

if (data == "24") {
    f.put(0x24);
}

if (data == "25") {
    f.put(0x25);
}

if (data == "26") {
    f.put(0x26);
}

if (data == "27") {
    f.put(0x27);
}

if (data == "28") {
    f.put(0x28);
}

if (data == "29") {
    f.put(0x29);
}

if (data == "2A") {
    f.put(0x2A);
}

if (data == "2B") {
    f.put(0x2B);
}

if (data == "2C") {
    f.put(0x2C);
}

if (data == "2D") {
    f.put(0x2D);
}

if (data == "2E") {
    f.put(0x2E);
}

if (data == "2F") {
    f.put(0x2F);
}

if (data == "30") {
    f.put(0x30);
}

if (data == "31") {
    f.put(0x31);
}

if (data == "32") {
    f.put(0x32);
}

if (data == "33") {
    f.put(0x33);
}

if (data == "34") {
    f.put(0x34);
}

if (data == "35") {
    f.put(0x35);
}

if (data == "36") {
    f.put(0x36);
}

if (data == "37") {
    f.put(0x37);
}

if (data == "38") {
    f.put(0x38);
}

if (data == "39") {
    f.put(0x39);
}

if (data == "3A") {
    f.put(0x3A);
}

if (data == "3B") {
    f.put(0x3B);
}

if (data == "3C") {
    f.put(0x3C);
}

if (data == "3D") {
    f.put(0x3D);
}

if (data == "3E") {
    f.put(0x3E);
}

if (data == "3F") {
    f.put(0x3F);
}

if (data == "40") {
    f.put(0x40);
}

if (data == "41") {
    f.put(0x41);
}

if (data == "42") {
    f.put(0x42);
}

if (data == "43") {
    f.put(0x43);
}

if (data == "44") {
    f.put(0x44);
}

if (data == "45") {
    f.put(0x45);
}

if (data == "46") {
    f.put(0x46);
}

if (data == "47") {
    f.put(0x47);
}

if (data == "48") {
    f.put(0x48);
}

if (data == "49") {
    f.put(0x49);
}

if (data == "4A") {
    f.put(0x4A);
}

if (data == "4B") {
    f.put(0x4B);
}

if (data == "4C") {
    f.put(0x4C);
}

if (data == "4D") {
    f.put(0x4D);
}

if (data == "4E") {
    f.put(0x4E);
}

if (data == "4F") {
    f.put(0x4F);
}

if (data == "50") {
    f.put(0x50);
}

if (data == "51") {
    f.put(0x51);
}

if (data == "52") {
    f.put(0x52);
}

if (data == "53") {
    f.put(0x53);
}

if (data == "54") {
    f.put(0x54);
}

if (data == "55") {
    f.put(0x55);
}

if (data == "56") {
    f.put(0x56);
}

if (data == "57") {
    f.put(0x57);
}

if (data == "58") {
    f.put(0x58);
}

if (data == "59") {
    f.put(0x59);
}

if (data == "5A") {
    f.put(0x5A);
}

if (data == "5B") {
    f.put(0x5B);
}

if (data == "5C") {
    f.put(0x5C);
}

if (data == "5D") {
    f.put(0x5D);
}

if (data == "5E") {
    f.put(0x5E);
}

if (data == "5F") {
    f.put(0x5F);
}

if (data == "60") {
    f.put(0x60);
}

if (data == "61") {
    f.put(0x61);
}

if (data == "62") {
    f.put(0x62);
}

if (data == "63") {
    f.put(0x63);
}

if (data == "64") {
    f.put(0x64);
}

if (data == "65") {
    f.put(0x65);
}

if (data == "66") {
    f.put(0x66);
}

if (data == "67") {
    f.put(0x67);
}

if (data == "68") {
    f.put(0x68);
}

if (data == "69") {
    f.put(0x69);
}

if (data == "6A") {
    f.put(0x6A);
}

if (data == "6B") {
    f.put(0x6B);
}

if (data == "6C") {
    f.put(0x6C);
}

if (data == "6D") {
    f.put(0x6D);
}

if (data == "6E") {
    f.put(0x6E);
}

if (data == "6F") {
    f.put(0x6F);
}

if (data == "70") {
    f.put(0x70);
}

if (data == "71") {
    f.put(0x71);
}

if (data == "72") {
    f.put(0x72);
}

if (data == "73") {
    f.put(0x73);
}

if (data == "74") {
    f.put(0x74);
}

if (data == "75") {
    f.put(0x75);
}

if (data == "76") {
    f.put(0x76);
}

if (data == "77") {
    f.put(0x77);
}

if (data == "78") {
    f.put(0x78);
}

if (data == "79") {
    f.put(0x79);
}

if (data == "7A") {
    f.put(0x7A);
}

if (data == "7B") {
    f.put(0x7B);
}

if (data == "7C") {
    f.put(0x7C);
}

if (data == "7D") {
    f.put(0x7D);
}

if (data == "7E") {
    f.put(0x7E);
}

if (data == "7F") {
    f.put(0x7F);
}

if (data == "80") {
    f.put(0x80);
}

if (data == "81") {
    f.put(0x81);
}

if (data == "82") {
    f.put(0x82);
}

if (data == "83") {
    f.put(0x83);
}

if (data == "84") {
    f.put(0x84);
}

if (data == "85") {
    f.put(0x85);
}

if (data == "86") {
    f.put(0x86);
}

if (data == "87") {
    f.put(0x87);
}

if (data == "88") {
    f.put(0x88);
}

if (data == "89") {
    f.put(0x89);
}

if (data == "8A") {
    f.put(0x8A);
}

if (data == "8B") {
    f.put(0x8B);
}

if (data == "8C") {
    f.put(0x8C);
}

if (data == "8D") {
    f.put(0x8D);
}

if (data == "8E") {
    f.put(0x8E);
}

if (data == "8F") {
    f.put(0x8F);
}

if (data == "90") {
    f.put(0x90);
}

if (data == "91") {
    f.put(0x91);
}

if (data == "92") {
    f.put(0x92);
}

if (data == "93") {
    f.put(0x93);
}

if (data == "94") {
    f.put(0x94);
}

if (data == "95") {
    f.put(0x95);
}

if (data == "96") {
    f.put(0x96);
}

if (data == "97") {
    f.put(0x97);
}

if (data == "98") {
    f.put(0x98);
}

if (data == "99") {
    f.put(0x99);
}

if (data == "9A") {
    f.put(0x9A);
}

if (data == "9B") {
    f.put(0x9B);
}

if (data == "9C") {
    f.put(0x9C);
}

if (data == "9D") {
    f.put(0x9D);
}

if (data == "9E") {
    f.put(0x9E);
}

if (data == "9F") {
    f.put(0x9F);
}

if (data == "A0") {
    f.put(0xA0);
}

if (data == "A1") {
    f.put(0xA1);
}

if (data == "A2") {
    f.put(0xA2);
}

if (data == "A3") {
    f.put(0xA3);
}

if (data == "A4") {
    f.put(0xA4);
}

if (data == "A5") {
    f.put(0xA5);
}

if (data == "A6") {
    f.put(0xA6);
}

if (data == "A7") {
    f.put(0xA7);
}

if (data == "A8") {
    f.put(0xA8);
}

if (data == "A9") {
    f.put(0xA9);
}

if (data == "AA") {
    f.put(0xAA);
}

if (data == "AB") {
    f.put(0xAB);
}

if (data == "AC") {
    f.put(0xAC);
}

if (data == "AD") {
    f.put(0xAD);
}

if (data == "AE") {
    f.put(0xAE);
}

if (data == "AF") {
    f.put(0xAF);
}

if (data == "B0") {
    f.put(0xB0);
}

if (data == "B1") {
    f.put(0xB1);
}

if (data == "B2") {
    f.put(0xB2);
}

if (data == "B3") {
    f.put(0xB3);
}

if (data == "B4") {
    f.put(0xB4);
}

if (data == "B5") {
    f.put(0xB5);
}

if (data == "B6") {
    f.put(0xB6);
}

if (data == "B7") {
    f.put(0xB7);
}

if (data == "B8") {
    f.put(0xB8);
}

if (data == "B9") {
    f.put(0xB9);
}

if (data == "BA") {
    f.put(0xBA);
}

if (data == "BB") {
    f.put(0xBB);
}

if (data == "BC") {
    f.put(0xBC);
}

if (data == "BD") {
    f.put(0xBD);
}

if (data == "BE") {
    f.put(0xBE);
}

if (data == "BF") {
    f.put(0xBF);
}

if (data == "C0") {
    f.put(0xC0);
}

if (data == "C1") {
    f.put(0xC1);
}

if (data == "C2") {
    f.put(0xC2);
}

if (data == "C3") {
    f.put(0xC3);
}

if (data == "C4") {
    f.put(0xC4);
}

if (data == "C5") {
    f.put(0xC5);
}

if (data == "C6") {
    f.put(0xC6);
}

if (data == "C7") {
    f.put(0xC7);
}

if (data == "C8") {
    f.put(0xC8);
}

if (data == "C9") {
    f.put(0xC9);
}

if (data == "CA") {
    f.put(0xCA);
}

if (data == "CB") {
    f.put(0xCB);
}

if (data == "CC") {
    f.put(0xCC);
}

if (data == "CD") {
    f.put(0xCD);
}

if (data == "CE") {
    f.put(0xCE);
}

if (data == "CF") {
    f.put(0xCF);
}

if (data == "D0") {
    f.put(0xD0);
}

if (data == "D1") {
    f.put(0xD1);
}

if (data == "D2") {
    f.put(0xD2);
}

if (data == "D3") {
    f.put(0xD3);
}

if (data == "D4") {
    f.put(0xD4);
}

if (data == "D5") {
    f.put(0xD5);
}

if (data == "D6") {
    f.put(0xD6);
}

if (data == "D7") {
    f.put(0xD7);
}

if (data == "D8") {
    f.put(0xD8);
}

if (data == "D9") {
    f.put(0xD9);
}

if (data == "DA") {
    f.put(0xDA);
}

if (data == "DB") {
    f.put(0xDB);
}

if (data == "DC") {
    f.put(0xDC);
}

if (data == "DD") {
    f.put(0xDD);
}

if (data == "DE") {
    f.put(0xDE);
}

if (data == "DF") {
    f.put(0xDF);
}

if (data == "E0") {
    f.put(0xE0);
}

if (data == "E1") {
    f.put(0xE1);
}

if (data == "E2") {
    f.put(0xE2);
}

if (data == "E3") {
    f.put(0xE3);
}

if (data == "E4") {
    f.put(0xE4);
}

if (data == "E5") {
    f.put(0xE5);
}

if (data == "E6") {
    f.put(0xE6);
}

if (data == "E7") {
    f.put(0xE7);
}

if (data == "E8") {
    f.put(0xE8);
}

if (data == "E9") {
    f.put(0xE9);
}

if (data == "EA") {
    f.put(0xEA);
}

if (data == "EB") {
    f.put(0xEB);
}

if (data == "EC") {
    f.put(0xEC);
}

if (data == "ED") {
    f.put(0xED);
}

if (data == "EE") {
    f.put(0xEE);
}

if (data == "EF") {
    f.put(0xEF);
}

if (data == "F0") {
    f.put(0xF0);
}

if (data == "F1") {
    f.put(0xF1);
}

if (data == "F2") {
    f.put(0xF2);
}

if (data == "F3") {
    f.put(0xF3);
}

if (data == "F4") {
    f.put(0xF4);
}

if (data == "F5") {
    f.put(0xF5);
}

if (data == "F6") {
    f.put(0xF6);
}

if (data == "F7") {
    f.put(0xF7);
}

if (data == "F8") {
    f.put(0xF8);
}

if (data == "F9") {
    f.put(0xF9);
}

if (data == "FA") {
    f.put(0xFA);
}

if (data == "FB") {
    f.put(0xFB);
}

if (data == "FC") {
    f.put(0xFC);
}

if (data == "FD") {
    f.put(0xFD);
}

if (data == "FE") {
    f.put(0xFE);
}

if (data == "FF") {
    f.put(0xFF);
}



}

f.close();

progressBar1->Value = 0;

MessageBox::Show("done saving the file");

}
4

1 回答 1

1

作家

首先,如果您不在编写String^ data = richTextBox1->Text;器端的循环的每次迭代开始时分配,您可以节省时间。相反,为什么不声明另一个变量 ( temp) 并保持data不变以减少赋值操作?例如:

String temp;
temp = data->Substring(countlength , 2);

然后,您可以有效地data = data->Substring(countlength , 2);从编写器例程中的循环开头删除。

其次,熟悉strtol()。该函数可以有效地将字符串 ( char *) 转换为任意基数的整数。例如:

char * string = "0f";
int num = strtol(string, NULL, 16); //Using base 16 (hex)

numint 这种情况下将是150x0F十六进制。这将基本上取代你的if声明堆。

读者

减少调用,Application::DoEvents();因为如果您不需要每次读入一个字节时都重新绘制,那么这太昂贵了。相反,例如以 10% 的间隔重新绘制。每次迭代都需要付出高昂代价,progressBar1->Value = progressBar1count / length * 100;但这也与整个重绘概念有关。换句话说,以比每个字节更合理的间隔更新您的 GUI

编辑 1:更改strtol(s, NULL, 16)strtol(string, NULL, 16)
编辑 2:将答案分成读/写部分。

于 2013-04-13T09:20:41.147 回答