2

以前に作成した変数に手動で記述した配列を割り当てる方法。

例:
ああ

class PredefinedMatrices {
public:
    PredefinedMatrices();

    unsigned char getSBoxValue(unsigned char hexNumber) const;

private:
    unsigned char sbox[256];
};

交流

PredefinedMatrices::PredefinedMatrices() {
    sbox[256] = //Sure it won't work
    {
        0x34, 0x5b,
        0x93, 0xc2
    };
}
unsigned char PredefinedMatrices::getSBoxValue(unsigned char hexNumber) const {
    return sbox[hexNumber];
}

クラスに値を直接割り当てることはできません。
それはうまくいきませんでした:

unsigned char *matrice;
matrice = new unsigned char[256]{...};

追加の割り当て時間とメモリ消費のために、必要な行列に一時行列のmemcpyを実行したくありません。

編集:手動で記述された配列は、AES暗号化のS-Boxです。私はそれを動的に計算することができますが、一定であり、の値がわかっているもののためにプロセッササイクルを無駄にしたくありません。

4

5 に答える 5

0

ちょっと考えてみてください。配列を項目ごとに埋めるか、バッファを使用してそこからデータをコピーする必要があります。C++が次のような構文をサポートしていると仮定します。

unsigned char myBuffer[256];
myBuffer = { 1, 2, ... };

では、コンパイラは一時バッファとmemcpy以外のことをしていると思いますか?また、配列を項目ごとに入力すると、実行速度に影響を与える大きなコードがあるため、これを実現する唯一の有効な方法は、一時バッファー+memcpyです。

于 2012-10-14T08:22:57.687 に答える
0

クラスに値を直接割り当てることはできません。

はい、そうなります。

matrice[0] = 0x34;
matrice[1] = 0x5b;
...

追加の割り当て時間とメモリ消費のために、必要な行列に一時行列のmemcpyを実行したくありません。

一時行列を作成static unsigned char [256]し、コンストラクターで定義して初期化する場合、追加の割り当て時間はなく(コンストラクターが呼び出されるたびではなく、プログラムがロードされるときに1回初期化されます)、メモリ消費量256バイトはの各要素をmatrice個別に埋めるコードよりも低くなる可能性が非常に高くなります。

生の配列をまったく使用しないというjrokのコメントは良いかもしれませんが、それは配列を使用している理由によって異なります。

于 2012-10-14T08:24:01.197 に答える
0

最後のインデックスが255の場合、配列の256番目の要素に誤って割り当てています。ベクトルを使用する方が、生の配列よりもはるかに優れたアプローチです。コンストラクターで行列を初期化できます。

class PredefinedMatrices {
public:
    PredefinedMatrices();

    vector<unsigned char> matrice;
};

PredefinedMartices::PredefinedMatrices()
{
    matrice.resize(256,0);
    matrice[0] = 0x34;
    matrice[1] = 0x5b;
    matrice[2] = 0x93;
    matrice[3] = 0xc2;
}
于 2012-10-14T09:05:04.327 に答える
0

C ++ 11を使用している場合は、通常の初期化構文を使用できます。

PredefinedMatrices::PredefinedMatrices()
  :sbox {
     0x34,
     0x5b,
     0x93,
     0xc2,
     /*...*/
    }
{}
于 2012-10-14T09:30:23.430 に答える
0

私は解決策を見つけました。私はこれをしました:
ああ

class PredefinedMatrices {
public:
    PredefinedMatrices();

    unsigned char getSBoxValue(unsigned char hexNumber) const;

private:
    static const unsigned char sbox[256]; //I use const only to allow the compiler to optimize the code better
};

a.cpp

PredefinedMatrices::PredefinedMatrices() {}

const unsigned char PredefinedMatrices::sbox[256] =
{
    0x34, 0x5b,
    0x93, 0xc2
};

unsigned char PredefinedMatrices::getSBoxValue(unsigned char hexNumber) const {
    return sbox[hexNumber];
}
于 2012-10-16T12:52:41.450 に答える