我遇到了一个小问题。.目前,我正在编写一个连接服务器的小工具,将一些河豚加密的数据下载到char Array (char buffer[512])并将该数组保存到文件(fstream ios::binary)

然后,我重新打开该文件(ifstream ios::binary)并将其发送回。这次我将其读入std::string而不是char[]

我现在的问题是,在我将数据发送回之后,数据已损坏。

做到这一点的最佳方法是什么?使用char[]std::string是否安全?还是以某种方式破坏了数据? (大概吧)。

如果您需要一些代码示例,我可以提供它们。

谢谢!

#########################

好吧,快速更新为您提供更多详细信息。

我正在为游戏编写工具(在OS X上),它分为两个部分:


从游戏服务器中检索加密的数据并保存。
将保存的加密数据发送回本地游戏


问题:当保存的数据到达本地游戏时,游戏只会吐出无法解密的数据=>数据损坏。

这是1的代码。(它只是出于自我测试的目的):

mode == 0 => no gameDataChunk there
mode == 1 => gameDataChunk there, need to write
mode == 2 => keyFrame there
*/
std::string socketRead(int socket, int mode, std::string num_chunk, std::string num_key, std::string game_id){

std::string response = "";

char buffer[512];

int bytes;

while((bytes = read(socket, buffer, 511)) > 0){

    std::string temp(buffer, bytes);

    //std::cout << temp;

    response = response + temp;

    if(!(temp.find("HTTP/1.1 200")<1800000)){
        if(temp.find("HTTP/1.1")<1800000){
            std::cout << std::endl << std::endl << "GOT NOT A 200 !!!" << std::endl << std::endl;
            std::cout << temp << std::endl << std::endl;
            return "EXIT";
        }
    }

    if(mode == 1){
        if(temp.find("\r\n\r\n")<1800000){
            write_gameDataChunk(buffer, 1, temp.find("\r\n\r\n")+4, num_chunk, game_id);
        }
        else{
            write_gameDataChunk(buffer, 0, 0, num_chunk, game_id);
        }
    }
    else if(mode == 2){
        if(temp.find("\r\n\r\n")<1800000){
            write_keyFrame(buffer, 1, temp.find("\r\n\r\n")+4, num_key, game_id);
        }
        else{
            write_keyFrame(buffer, 0,0, num_key, game_id);
        }
    }

    bzero(buffer, 512);

}

return response;

}

void write_gameDataChunk(char buffer[], int mode, int index, std::string num, std::string game_id){

std::fstream write;

char local_buffer[512];

if(mode == 0){
    //complete bin data

    write.open("/tmp/" + game_id + "/" + num + "/game_dataChunk.bin", std::ios::out | std::ios::binary | std::ios::app);

    write << buffer;

}
else if(mode == 1){
    //partial bin data

    std::string command = "mkdir /tmp/" + game_id + "/" + num;
    std::system(command.c_str());

    write.open("/tmp/" + game_id + "/" + num + "/game_dataChunk.bin", std::ios::out | std::ios::binary);

    strcpy(local_buffer, buffer+index);

    write << local_buffer;

}

write.close();

}


这是2的代码:

std::string get_DataChunk(std::string game_id, int chunkId){

std::ifstream read;

std::string dummy;
std::string command;
std::string result = "";

command = "/tmp/" + game_id + "/" + std::to_string(chunkId) + "/game_dataChunk.bin";

read.open(command.c_str(), std::ios::in | std::ios::binary);

while(getline(read,dummy)){

    result = result + dummy;

}

read.close();

return result;

}


这都是我自己的测试代码,尚未完成,因此有点丑陋……但我希望您能理解我的意思。我不必经常处理通过套接字发送的二进制数据。

最佳答案

std::string并不意味着要处理二进制文件。它旨在处理字符串。

您想要的是一个std::vector<char>,它与您要存储的值无关。

10-06 13:50
查看更多