0

自動更新プログラムに問題があります

ウェブサイトからアップデートをダウンロードして保存することになっていますが、問題は(これは頻繁に発生すると確信していますが、Googleで答えを得るキーワードをフレーズできませんでした).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();

Google を使用してみましたが、適切な結果が得られるような質問をすることができませんでした。

4

3 に答える 3

1

out ファイルをバイナリ モードで開いていることを確認します。

std::ofstream put("Eprog.exe", ios::binary | ios::hex );
于 2010-11-05T22:30:58.830 に答える
0

あなたのコードで私が目にするより大きな問題は、あなたが呼び出したときにEdat.c_str()、おそらくconst char*ストリームに a を与えていることです。このポインターには、ストリームに書き込む量に関する情報がないため、慣例により、最初の ' \0' で停止する必要があります。

代わりにwrite()呼び出しを使用し、生の char バッファーを使用する必要があります。

于 2010-11-05T21:10:32.993 に答える
0

コンパイラに値を16進数として解釈させる代わりに、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; 
}
于 2010-11-06T18:26:21.120 に答える