2010-11-05 129 views
0

我有C++自动更新程序

它应该下载&保存所有来自网站的更新,但问题是(我敢肯定,这种情况很多与我的自动更新程序问题但我不能短语的关键字,会让我在谷歌的答案)它保存所收到的.exe数据不是它应该的。这样可以节省字节ACSI ...让我举例说明:

Offset  0 1 2 3 4 5 6 7 8 9 A B C D E F 

00000000 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 MZ   ÿÿ 
00000010 B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ¸  @  
00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00     
00000030 00 00 00 00 00 00 00 00 00 00 00 00 B0 00 00 00    ° 

这个数据,(这是正确的数据)貌似这个新计划:

Offset  0 1 2 3 4 5 6 7 8 9 A B C D E F 

00000000 0D 0A 34 44 35 41 39 30 30 30 30 33 30 30 30 30  4D5A9000030000 
00000010 30 30 30 34 30 30 30 30 30 30 46 46 46 46 30 30 0004000000FFFF00 
00000020 30 30 42 38 30 30 30 30 30 30 30 30 30 30 30 30 00B8000000000000 
00000030 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 0040000000000000 

正如你所看到的它写码 - 字节的ASCII值... 这是我使用

接收部分代码:

char szRecvBuff[10000] = "" ; 
string szRecvHolder = "" ;  
int iLastCharacter = 0; 

    recv(Socket, szRecvBuff, sizeof(szRecvBuff), 0); 

    szRecvHolder = szRecvBuff; 

    iLastCharacter = szRecvHolder.find_last_of("\n"); 
    if(iLastCharacter < szRecvHolder.size() && iLastCharacter > 0){ 
    szRecvHolder.erase(iLastCharacter); 
    } 
    return szRecvHolder; 
} 
... 
... 
{ 
... 
... 
Recv(); 
string Edat = Recv(); 
std::ofstream put("Eprog.exe", ios::hex); 
put << Edat.c_str(); 
put.close(); 

有人知道如何去做,我试过使用谷歌,但我不能说一个问题,会给我正确的结果

+0

我错了或ios :: hex是位图,运算符是std :: hex? – 2010-11-05 21:01:41

+0

他可能希望ios :: binary而不是ios :: hex。但这不是唯一的问题。 – 2010-11-05 21:04:55

回答

0

我看到你的代码更大的问题是,当你打电话给Edat.c_str()你大概给const char*流。这个指针没有写入流的信息,所以它必须按照惯例在第一个'\0'停止。

您应该改用write()调用并使用原始字符缓冲区。

+0

虽然我已将代码更改为您所描述的内容,因为它看起来更正确,但结果write()并没有差异,并将其放入<< – rick 2010-11-05 21:20:44

1

确保你打开你出的文件以二进制方式:

std::ofstream put("Eprog.exe", ios::binary | ios::hex); 
+0

它没有任何作用,字节是错误的 – rick 2010-11-06 09:29:49

0

我已经解决了这个问题,而不是试图使编译器解释值作为十六进制我只是做一个查找表包含全部256个可能的字节。

unsigned char Table[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF }; 



int GetIndexNumber(string str){ 
unsigned long rint = NULL; 
unsigned long size = str.size() - 2; 
unsigned long fi[sizeof(str)]; 
unsigned long mul; 

for(int i = 0; i != 2; i++){ 
    if(str.at(i+2) == '0') fi[i] = 0; 
    if(str.at(i+2) == '1') fi[i] = 1; 
    if(str.at(i+2) == '2') fi[i] = 2; 
    if(str.at(i+2) == '3') fi[i] = 3; 
    if(str.at(i+2) == '4') fi[i] = 4; 
    if(str.at(i+2) == '5') fi[i] = 5; 
    if(str.at(i+2) == '6') fi[i] = 6; 
    if(str.at(i+2) == '7') fi[i] = 7; 
    if(str.at(i+2) == '8') fi[i] = 8; 
    if(str.at(i+2) == '9') fi[i] = 9; 
    if(str.at(i+2) == 'A') fi[i] = 10; 
    if(str.at(i+2) == 'B') fi[i] = 11; 
    if(str.at(i+2) == 'C') fi[i] = 12; 
    if(str.at(i+2) == 'D') fi[i] = 13; 
    if(str.at(i+2) == 'E') fi[i] = 14; 
    if(str.at(i+2) == 'F') fi[i] = 15; 
} 

for(int i = 0; i != 2 ; i++){ 
    mul = (1 * pow(16, (double)size-1)); 
    size--; 
    rint += (mul * fi[i]); 
} 
return rint; 
} 

Recv(); 
string Edat = Recv(); 
Edat += Recv(); 
cout<<Edat.c_str()<<endl<<endl; 

unsigned char buffer[10000] = ""; 

for(int i = 0; i <= Edat.size(); i++){ 
    int PlaceHolder = Edat.find_first_of("0x"); 
    if(PlaceHolder <= Edat.size() && PlaceHolder > 0){ 
     string tmpstr = Edat.substr(PlaceHolder, 4); 
     int TableNumber = GetIndexNumber(tmpstr); 
     buffer[i] = Table[TableNumber]; 
    } 
    Edat.replace(PlaceHolder, 4, ""); 
} 

std::ofstream put("Eprog.exe", ios::binary); 
put.write((char *)buffer, sizeof(buffer)); 
put.close(); 

return 0; 
}