将 2D 矢量转换为 C 类型的最佳方法(对于 SGX 飞地)
Best way to convert 2D vector to C type (for SGX enclave)
我正在尝试编写一个 SGX enclave,它接受 int 的二维向量(表示灰度图像),但 edger8r 只接受 C 类型。
我知道 and ,但有人可以提供有关如何转换类型的示例:
vector< vector <int> > ImagePixels;
转换成 C 类型以便我可以将它传递给 SGX 飞地?
std::vector
有一个 data()
方法,可以为您提供指向其数据的简单指针。但是,您需要对第二层向量做一些处理,因此您需要创建一个临时数组来存储来自内部向量的普通指针列表。
#include <algorithm>
#include <iostream>
#include <vector>
extern "C" int my_c_function(int **double_pointer, int rows, int cols) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%d ", double_pointer[i][j]);
}
printf("\n");
}
}
int main() {
std::vector<std::vector<int>> ImagePixels{{1, 2, 3}, {4, 5, 6}};
// transform a vector of vectors into a vector of pointers
std::vector<int*> ptrs(ImagePixels.size());
std::transform(begin(ImagePixels), end(ImagePixels), begin(ptrs),
[](std::vector<int> &inner_vec) {
return inner_vec.data();
});
my_c_function(ptrs.data(), ImagePixels.size(), ImagePixels[0].size());
}
实例:https://onlinegdb.com/BJvb3yG3f
但是,如果您可以控制整个代码,我建议您使用平面结构,您只需将整个图片逐行存储到故障 std::vector<int>
中。您甚至可以围绕 std::vector 做一个简单的包装器,以便更容易地操作这样的结构:
class image {
public:
image(int rows = 0; int cols = 0)
: rows_{rows}, cols_{cols}, data_(rows * cols) {}
int &operator ()(int row, int col) {
return data_[row * cols_ + col];
}
int *data() { return data_.data(); };
// needs a few more utilities and constant versions of the methods
private:
std::vector<int> data_;
int rows_;
int cols_;
};
那么你可以这样做:
image im(3, 2);
// set pixels
im(0, 0) = 1;
im(0, 1) = 2;
int *d = im.data(); // a plain pointer to an array of data
我正在尝试编写一个 SGX enclave,它接受 int 的二维向量(表示灰度图像),但 edger8r 只接受 C 类型。
我知道
vector< vector <int> > ImagePixels;
转换成 C 类型以便我可以将它传递给 SGX 飞地?
std::vector
有一个 data()
方法,可以为您提供指向其数据的简单指针。但是,您需要对第二层向量做一些处理,因此您需要创建一个临时数组来存储来自内部向量的普通指针列表。
#include <algorithm>
#include <iostream>
#include <vector>
extern "C" int my_c_function(int **double_pointer, int rows, int cols) {
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
printf("%d ", double_pointer[i][j]);
}
printf("\n");
}
}
int main() {
std::vector<std::vector<int>> ImagePixels{{1, 2, 3}, {4, 5, 6}};
// transform a vector of vectors into a vector of pointers
std::vector<int*> ptrs(ImagePixels.size());
std::transform(begin(ImagePixels), end(ImagePixels), begin(ptrs),
[](std::vector<int> &inner_vec) {
return inner_vec.data();
});
my_c_function(ptrs.data(), ImagePixels.size(), ImagePixels[0].size());
}
实例:https://onlinegdb.com/BJvb3yG3f
但是,如果您可以控制整个代码,我建议您使用平面结构,您只需将整个图片逐行存储到故障 std::vector<int>
中。您甚至可以围绕 std::vector 做一个简单的包装器,以便更容易地操作这样的结构:
class image {
public:
image(int rows = 0; int cols = 0)
: rows_{rows}, cols_{cols}, data_(rows * cols) {}
int &operator ()(int row, int col) {
return data_[row * cols_ + col];
}
int *data() { return data_.data(); };
// needs a few more utilities and constant versions of the methods
private:
std::vector<int> data_;
int rows_;
int cols_;
};
那么你可以这样做:
image im(3, 2);
// set pixels
im(0, 0) = 1;
im(0, 1) = 2;
int *d = im.data(); // a plain pointer to an array of data