我遇到了一个小问题。.目前,我正在编写一个连接服务器的小工具,将一些河豚加密的数据下载到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>
,它与您要存储的值无关。