C++: バイナリのデコード時に文字化けが起きる
Q&A
Closed
今winsock2を使ってクライアントからサーバーにファイルを送るプログラムを書いています。
ファイルを送る機能の試作として以下のようなプログラムを書きました。
#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#define MESSAGE_LENGTH 10
int main()
{
char buffer[MESSAGE_LENGTH];
std::string message_gather;
std::ifstream file("test.cpp", std::ios_base::ate, std::ios_base::binary);
std::string str;
std::streamsize end_pos = file.tellg();
file.seekg(0, std::ios::beg);
while (file.read(buffer, sizeof(buffer))) {
str += std::string(buffer);
}
if (end_pos - file.tellg() > 0) {
memset(buffer, '\0', sizeof(buffer));
file.read(buffer, sizeof(char) * (end_pos - file.tellg()));
str += std::string(buffer);
}
std::cout << str << std::endl;
}
機能としてはファイルの中身をMESSAGE_LENGHTで分割してパケットに乗せて送信し、それを受け取り手が合体してファイルを復元する、といったことをしたいと思っています。このコードでは送信する部分を省いて、ファイルの分割→再結合を行っています。
出力は以下のとおりです。
#include <フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォiostream>
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ#include <フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォsstream>
#フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォinclude <fフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォstream>
#iフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォnclude <veフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォctor>
#deフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォfine MESSAフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォGE_LENGTH フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ10
int maiフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォn()
{
chaフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォr buffer[Mフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォESSAGE_LENフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォGTH];
stdフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ::string mフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォessage_gatフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォher;
std:フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ:ifstream フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォfile("testフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ.cpp", stdフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ::ios_baseフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ::ate, stdフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ::ios_baseフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ::binary);フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ
std::strフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォing str;
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ std::streフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォamsize endフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ_pos = filフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォe.tellg();フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ
file.seeフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォkg(0, std:フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ:ios::beg)フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ;
while フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ(file.readフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ(buffer, sフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォizeof(buffフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォer))) {
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォstr += stdフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ::string(bフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォuffer);
}フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ
if (fileフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ.gcount() フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ> 0) {
mフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォemset(buffフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォer, '\0', フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォsizeof(bufフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォfer));
fフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォile.read(bフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォuffer, sizフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォeof(char) フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ* (end_posフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ - file.teフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォllg()));
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ str += stフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォd::string(フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォbuffer);
フフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ }
std::cフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォout << strフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ << std::eフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフタ稀モォ
デコード自体はできているようですが、不要な部分(フフフ...の部分)までデコードしてしまっている?様です。
質問ですが
1:なぜフフフ...の部分が出力に表れているのか、
2:whileループ部分で読み取り切れなかった、MESSAGE_LENGTHよりも短い残りを読み取る部分(ifの部分)がなぜ動いていないのか
3:そもそもファイルを分割して送信→再結合するやり方としてもっといい方法があるか
お聞きしたいです。