I'm having problems with an auto-update program of mine
It's supposed to download & save an update from a website, but the problem is(And I'm sure that this happens alot yet I couldn't phrase the keywords that would get me the answer on google) it saves the .exe data it receives not as it's supposed to. It saves the bytes in acsi... let me illustrate that:
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 °
This data, (which is the correct data) Looks like this in the new program:
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
As you can see it writes the codebytes as ascii values... This is the code I'm using
The receiving part:
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();
Does anyone know how to go about it, I've tried using google, but I couldn't phrase a question that would give me proper results
确保以二进制模式打开输出文件:
std::ofstream put("Eprog.exe", ios::binary | ios::hex );
The bigger problem I see with your code is that when you call to Edat.c_str()
you're giving presumably a const char*
to the stream. This pointer has no information on how much to write to the stream, so it has to stop, by convention, at the first ' \\0
'.
You should instead use the write()
call and use a raw char buffer.
I've solved the problem, instead of trying to make the compiler interpret the values as hex I've simply made an lookup table containing all 256 possible bytes.
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;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.