hhh如果你找到这篇文章,相信我也不用重新介绍这个东西了,那我就可以直接上代码了。
int MatCodeEmbed(int n, vector<int> x, vector<int> a) {
// @ n 需要嵌入的数据长度
// @ x 需要嵌入的数据,长度为n
// @ a 原先的码元,长度为2^n - 1
vector<bitset<16>> b;
for (int i = 0; i < (1 << n) - 1; i++) b.push_back(bitset<16>(i + 1));
vector<int> c(n);
for (int j = 0; j < n; j++) {
int val = 0;
for (int i = 0; i < (1 << n) - 1; i++)
val ^= (a[i] * b[i][j]);
c[j] = (x[j] != val);
}
int C = 0;
for (int j = 0; j < n; j++)
C += c[j] * (1 << j);
// # 需要修改则返回需要修改的码元下标(从0开始),不需要修改则返回-1
return C - 1;
}
vector<int> MatCodeExtract(int n, vector<int> a) {
// @ n 嵌入的数据长度
// @ a 原先码元的,长度为2^n - 1
vector<int> x(n);
vector<bitset<16>> b;
for (int i = 0; i < (1 << n) - 1; i++) b.push_back(bitset<16>(i + 1));
for (int j = 0; j < n; j++) {
for (int i = 0; i < (1 << n) - 1; i++) {
x[j] ^= (a[i] * b[i][j]);
}
}
// 返回提取出来的嵌入bit
return x;
}
可以当作黑箱直接用,需要注意的是嵌入的个数应该小于等于16,bitset<16>这个被定死的,当然你要更大也可以自己把这个数字加大,毕竟嵌入16个bit需要65535个载体hhh矩阵编码写入的时候返回的是下标(也就是说是从零开始的),如果返回值是-1则说明不需要修改。