我遇到了一个小问题。目前我正在编写一个连接到服务器的小工具,将一些河豚加密数据下载到char Array
(char buffer[512])
并将该数组保存到文件{{1} }。
然后我重新打开该文件(fstream ios::binary)
并将其发回。这次我把它读成(ifstream ios::binary)
而不是std::string
。
现在我的问题是我发回数据后数据已损坏。
最好的方法是什么?使用char[]
和char[]
是否安全?或者这会以某种方式破坏数据? (我想是这样)。
如果您需要一些代码示例,我可以提供它们。
谢谢!
##########################
好的快速更新,为您提供更多详细信息。
我正在为游戏编写一个工具(在OS X上),它分为两个部分:
问题:当保存的数据到达本地游戏时,游戏只是吐出数据无法解密=>数据损坏。
这里是1的代码(它只是用于自我测试目的的poc):
std::string
以下是2。的代码:
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();
}
这是我自己的所有测试代码而没有完成,所以它有点丑......但我希望你能理解我的意思。我经常不必处理通过套接字发送的二进制数据..
答案 0 :(得分:1)
std::string
并不意味着要处理二进制文件。它旨在处理字符串。
您想要的是std::vector<char>
,它并不关心您存储的值。
答案 1 :(得分:0)
二进制数据中的任何'\ 0'将停止构造std :: string。所以std :: string()。size()只计算在第一个'\ 0'之前的字符。使用std :: vector&lt; unsigned char&gt;代替。
顺便问一下,1800000是什么意思?我知道HTTP/1.1 200
是你最早收到的角色。(英语不好)