Re: セーブデータの隠蔽、暗号化の基礎 ( No.1 ) |
- 名前:GPGA 日時:2009/01/06 05:38
外部から見えなくするということは、無理にテキスト形式で保存する必要は
無いという認識でよいですか?
であるならば、以下の方法はいかがですか?
struct persons{
char name[24];
int HP;
int MP;
short int LV;
int EXP;
short int …(その他パラメータが大量)
}person[NumOfMember];
// 暗号キー
const unsigned char encKey = 0x89;
// セーブ
void Save(const char* szFileName) {
FILE* fp;
fp = fopen(szFileName, "wb");
// 暗号化をやる場合
#ifdef ENCRYPTION
unsigned char* p = (char*)person;
for (int i = 0; i < sizeof(person); ++i) {
p[i] ^= encKey
}
#endif
fwrite(person, sizeof(person), NumOfMember, fp);
fclose(fp);
}
// ロード
void Save(const char* szFileName) {
FILE* fp;
fp = fopen(szFileName, "rb");
if (fp == NULL) {
printf("ファイルが存在しません。");
return ;
}
fread(person, sizeof(person), NumOfMember, fp);
// 複合化する必要がある場合
#ifdef ENCRYPTION
unsigned char* p = (char*)person;
for (int i = 0; i < sizeof(person); ++i) {
p[i] ^= encKey
}
#endif
fclose(fp);
}
上記のように、構造体配列を丸々保存してしまうのが一番簡単だと思います。
|
Re: セーブデータの隠蔽、暗号化の基礎 ( No.2 ) |
- 名前:dal 日時:2009/01/07 01:26
基礎を疎かにすることの愚かさを思い知りました。
思いて学ばざるすなわち危うしというやつを痛感しました。
今回の問題がすっきり解決したのみならず、
データというものがどういうものなのかということと、
テキストファイル、バイナリファイルとは
どういうことなのか本質的な所を理解できていなかったのが、
非常に理解が深まりました。
本当にありがとうございました。
|
Re: セーブデータの隠蔽、暗号化の基礎 ( No.3 ) |
- 名前:通 日時:2009/01/07 10:21
補足ですが、構造体をバイナリで保存する場合は、
以下の点にも注意が必要です。
・その構造体にポインタが含まれていないこと
・その構造体のバイトアライメントを1にしておく事
ポインタ型はその性質上、実行時以外に意味を
持たないので、これをそのまま書き出しても
無意味です。
バイトアライメントはたとえば今後新しいOSなどが
出た場合に、アプリ側を新しくコンパイルすると
構造体自体のサイズが変わってしまう場合があります
この場合は過去に記録された古いセーブデータを
読み込ませると誤動作を起こすきっかけになります
>テキストファイル、バイナリファイルとは
これがヒトに説明できるようになれば、
理解できたということだと思います。
|
Re: セーブデータの隠蔽、暗号化の基礎 ( No.4 ) |
- 名前:GPGA 日時:2009/01/07 12:56
2箇所ミスがありました。
×fwrite(person, sizeof(person), NumOfMember, fp);
○fwrite(person, sizeof(persons), NumOfMember, fp);
×fread(person, sizeof(person), NumOfMember, fp);
○fread(person, sizeof(persons), NumOfMember, fp);
|
|