将手动编写的数组分配给之前创建的变量

时间:2012-10-14 08:12:49

标签: c++ arrays

如何将手动编写的数组分配给之前创建的变量。

例如:
A.H

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。我可以动态地计算它,但我不想浪费处理器周期来保持不变的东西,我们知道它的值。

5 个答案:

答案 0 :(得分:0)

考虑一下,您应该逐项填充数组或使用缓冲区并从中复制数据。假设C ++支持这样的语法:

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

那么你认为编译器除了临时缓冲区和memcpy之外还做了什么吗? 如果逐项填充数组,则会有更大的代码影响执行速度,因此实现此目的的唯一有效方法是临时缓冲区+ memcpy。

答案 1 :(得分:0)

  

直接在类中分配值不起作用。

是的,它会。

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

由于额外的分配时间和内存消耗,我不想在我需要的矩阵中做一个临时矩阵的memcpy。

如果你创建临时矩阵static unsigned char [256]并在构造函数中定义并初始化它,则没有额外的分配时间(它在程序加载时初始化一次,而不是每次调用构造函数时),以及内存消耗(256字节)很可能低于分别填充matrice每个元素的代码。

jrok评论不使用原始数组可能会很好,但这取决于你使用数组的原因。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

如果您使用的是C ++ 11,则可以使用常规初始化语法:

PredefinedMatrices::PredefinedMatrices()
  :sbox {
     0x34,
     0x5b,
     0x93,
     0xc2,
     /*...*/
    }
{}

答案 4 :(得分:0)

我找到了解决方案。我这样做了:
A.H

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];
}