ファイルのビット操作について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bitter_orange

ファイルのビット操作について

#1

投稿記事 by bitter_orange » 16年前

お世話になっております。
C言語でゲームを作っていてセーブ機能を作っているときにわからないことがあったので質問させていただきました。
ファイルをfwrite関数やfread関数で読み書きをしていて、セーブをしたい内容をセーブ専用の構造体にいれています。
その後、セーブ専用の構造体を作り、数値を入れ、それをfwrite関数やfread関数でファイル入出力しています。
その時バイナリモードで入出力していますが、念のため暗号化をしようと思いビット操作することにしました。
一番手軽にできそうな構造体の中身を全て反転ビットをさせようと思ったのですが効率的な方法が思いつきません。
もちろん下記のようにすればできるのですがセーブしたい変数の量が多くなってしまった時や入出力したい構造体の変数に
自作の構造体があった時などに非常に大変になってしまうので、できれば避けたいです。
例)
dat.suuti = ~suuti;
dat.abc.suuti2 = ~abc.suuti2;
これ以外の方法でビット操作する方法はないでしょうか?

動作するプログラムをここに書くとあまりにも長くなってしまうためは添付しておきます。

OSは[Windows Vista]で開発環境は[Microsoft Visual C++ 2008 Express Edition]です。

よろしくお願いします。

御津凪

Re:ファイルのビット操作について

#2

投稿記事 by 御津凪 » 16年前

こんな感じでデータをまとめてビット操作できますよ。
void crypt( void* data, unsigned int size, unsigned char code ){
    unsigned char* ch = (unsigned char*)data;
    unsigned char* ch_end = ch + size;
    while(ch < ch_end){
        *ch ^= code;
        ++ch;
    }
}
(暗号化は指定ビットのみ反転できるように code を用意しました)

bitter_orange

Re:ファイルのビット操作について

#3

投稿記事 by bitter_orange » 16年前

そんな方法があったのですね。
汎用ポインタとunsigned charを使ったことがなかったのでこの考え方はできませんでした。
この方法なら、float型も暗号化して入出力できますし、セーブ構造体の中に構造体があってもmemcpy関数を使うことができますね。
御津凪様ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る