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

直接在类中分配值是行不通的。

是的,它会的。

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

由于额外的分配时间和内存消耗,我不想将临时矩阵的 memcpy 放入我需要的矩阵中。

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

jrok 关于根本不使用原始数组的评论可能很好,但这取决于您使用数组的原因。

于 2012-10-14T08:24:01.197 回答
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 回答
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++ 支持这样的语法:

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

那么你认为编译器做的不是临时缓冲区和 memcpy 吗?如果你逐项填充数组,你有一个更大的代码会影响你的执行速度,所以实现这一点的唯一有效方法是 temp buffer + memcpy。

于 2012-10-14T08:22:57.687 回答
0

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

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