質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

C++ 関数の動作について ご教授ください。

受付中

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 248

Mikan2

score 4

現状動作している以下のプログラムを用いて異なるハードで動作させようとしているのですが
以下の処理の動作が理解できず困っておりますのでお助けください。

不明点(以下ソースコードに番号を振ってあります。)
①について 
word_typeという構造体を wという名前で44個作るという意味であっていますでしょうか?
4*(10+1) はシンプルに4×11=44と考えてよろしかったでしょうか?

②について
dataには16個しかデータは入っていないのですがdata[4*i+3]この記述だとiが3の時
data[24]となり参照できないのではと考えているのですが合っていますでしょうか?

③について
①と同様に44回繰り返すと考えてよろしいでしょうか?

④について
tmp→tmpへの値の入れ替えをしているように見えますが
これには意味があるのでしょうか?この関数を通ってもtmpの値は変わらないのでは?

⑤について
「^」は何を意味しているのでしょうか?

無知で申し訳ありません。
分かるところだけでも教えていただければと思います。
よろしくお願いします。

以下ソースコード抜粋

 byte data[16] ={0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23};  

struct word_type {
    byte b[4];
} ;
struct word_type w[4*(10+1)] ;//・・・・・①

void Expansion(byte data[], struct word_type w[])
{
    struct word_type tmp;
    byte i;

    i = 0;
    while (i < 4)
    {
        w[i].b[0] = data[4*i] ;//・・・・・・②
        w[i].b[1] = data[4*i+1];//・・・・・②
        w[i].b[2] = data[4*i+2];//・・・・・②
        w[i].b[3] = data[4*i+3];//・・・・・②
        i = i+1;
    }

    i = 4;
    while (i < (4 * (10+1)))  ・・・・③
    {
        tmp.b[0] = w[i-1].b[0];
        tmp.b[1] = w[i-1].b[1];
        tmp.b[2] = w[i-1].b[2];
        tmp.b[3] = w[i-1].b[3];

        if (i % 4 == 0) {
          RWord(tmp,tmp);//・・・・・④
          SWord(tmp,tmp);
          XWord( tmp, Rcon[i/4], tmp);
        }
        XWord(w[i-4], tmp, w[i]);
        i = i + 1;
    }

}


void RWord(struct word_type w, struct word_type s)
{
    struct word_type result;
    result.b[0] = w.b[1] ;
    result.b[1] = w.b[2] ;
    result.b[2] = w.b[3] ;
    result.b[3] = w.b[0] ;

    s.b[0] = result.b[0] ;
    s.b[1] = result.b[1] ;
    s.b[2] = result.b[2] ;
    s.b[3] = result.b[3] ;
}

void XWord( struct word_type w1, struct word_type w2, struct word_type s )
{
    struct word_type result;
    result.b[0] = w1.b[0] ^ w2.b[0] ;//  ・・・・⑤
    result.b[1] = w1.b[1] ^ w2.b[1] ;//  ・・・・⑤
    result.b[2] = w1.b[2] ^ w2.b[2] ;//  ・・・・⑤
    result.b[3] = w1.b[3] ^ w2.b[3] ;//  ・・・・⑤

    s.b[0] = result.b[0] ;
    s.b[1] = result.b[1] ;
    s.b[2] = result.b[2] ;
    s.b[3] = result.b[3] ;
}



byte SByte(byte b){ return Sbox[b]; }

byte Sbox[256] = {ここにはバラバラの数字が25616進数で格納されています}

void SWord(struct word_type w, struct word_type o )
{
    struct word_type result;
    result.b[0] = SByte(w.b[0]) ;
    result.b[1] = SByte(w.b[1]) ;
    result.b[2] = SByte(w.b[2]) ;
    result.b[3] = SByte(w.b[3]) ;

    o.b[0] = result.b[0] ;
    o.b[1] = result.b[1] ;
    o.b[2] = result.b[2] ;
    o.b[3] = result.b[3] ;
}
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2020/07/12 19:22

    そのコードはあなたが書いたものではないですよね?
    どこにあったコードなんでしょうか

    キャンセル

  • Mikan2

    2020/07/12 19:29

    私が書いたものではありません。
    知人から頂いたものです。
    その知人も頂いたものらしくプログラムの意味までは理解していませんでしたので今回ご質問させて頂きました。わかりづらくて申し訳ありません。

    キャンセル

回答 2

0

そもそもなんですけど、構造体は=でコピーできます。

もう一度いいますが、構造体は=でコピーできます。

struct word_type {
    byte b[4];
} ;

        tmp.b[0] = w[i-1].b[0];
        tmp.b[1] = w[i-1].b[1];
        tmp.b[2] = w[i-1].b[2];
        tmp.b[3] = w[i-1].b[3];

というのは

struct word_type {
    byte b[4];
} ;

        tmp = w;

で終わりです。

大体、例えばword_typeのメンバーのbの要素数が4じゃなくなったらどうやって修正するんですか、もっと楽をしましょう。

構造体配列のコピーはmemcpyするべきでしょう。

その他すでに指摘のあるとおりです。

元のコード書いた人に
Cプログラミング診断室
を読ませてあげたいですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

1.そんでいいです
2.あってます
3.iの初期値に4がはいってるので、繰り返しは40回のようです
4.そのとおり、なにもかわりません。
5.^はビットごとの排他的論理和(XOR)を表しています

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/12 20:58 編集

    SHOMIさん、確かにそうですね。見落としていました。
    Mikan2さん、ローテーションの意味ですが、resultとwの間で、result.b[0] = w.b[1];のように順番を一つずらすようなコピーをしていることを指しています。
    元の配列を書き換えたかったら、引数をポインタにするか、参照渡しにする必要があります。

    キャンセル

  • 2020/07/12 21:01

    >RWord(tmp,tmp)
    >この書き方だとtmpをtmpに入れ替える意味の無い動作のように見える
    RWord()の中ではtmpの1バイト目を4バイト目に、2バイト目を1バイト目に、3バイト目を2バイト目に、4バイト目を3バイト目に移し替えていますよ。
    値渡しになっているので移し替えた結果はtmpに格納されていませんが、おそらく本来は参照渡しにしてtmpの内容を変更したかったのでしょう。

    キャンセル

  • 2020/07/13 00:21

    KoichiSugiyamaさん
    ありがとうございます。ローテーションの意味理解しました!
    SHOMIさん
    回答ありがとうございます。
    ということは、RWord、SWord、XWordの関数、もっというとそれらを呼び出している
    Expansionの関数自体も値渡しなので関数の処理終了と同時に代入されたそれぞれの値は
    消えてなくなるということでしょうか?
    よろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る