如何将手动编写的数组分配给之前创建的变量。
例如:
的 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。我可以动态地计算它,但我不想浪费处理器周期来保持不变的东西,我们知道它的值。
答案 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];
}