我正在打包要發送到另一臺設備的訊息。我正在使用 C 11。通常有效載荷是一個單一的 ASCII 編碼值,但是這個命令有更多的引數。我正在嘗試將有效負載打包在單個字符陣列中。我正在尋找一個干凈的解決方案,我認為以下(示例)解決方案應該可以作業:
Message foo(Parameters parameters) {
struct __attribute__((__packed__)) ParameterPayload {
std::array<char,2> a;
std::array<char,2> b;
std::array<char,2> c;
std::array<char,4> d;
}; // Actual struct has way more parameters
ParameterPayload paramPayload;
paramPayload.a = bar<2,10>(parameters.a);
paramPayload.b = bar<2,10>(parameters.b);
paramPayload.c = bar<2,10>(parameters.c);
paramPayload.d = bar<4,16>(parameters.d);
// This will not work, but I want something like this to work
auto payload = reinterpreted_cast<std::array<char, sizeof(ParameterPayload)>(paramPayload);
return baz<sizeof(ParameterPayload)>(payload);
}
template<size_t size, int base>
std::array<char, size> bar(int input> {
// ASCII encoding with a base (2, 10 or 16)
}
template<size_t payloadSize>
Message baz(std::array<char, payloadSize> payload) {
// Some packing computation
}
這是一個粗略的例子,但我認為它會傳達資訊。如何將結構轉換為單個 std:array<char, N>?甚至可能嗎?我試圖不做多個 std::copies ,因為這會花費更多資源并且會降低可讀性。
我研究的另一個解決方案是使用
const char* const payload = reinterpret_cast<const char* const>(¶mPayload);
然后從那里開始......之后我可以做一個副本,但我想避免它。
uj5u.com熱心網友回復:
那個鑄造是迂腐的 UB(甚至我們也不能保證 的確切大小std::array)。
我建議更改為:
Message foo(Parameters parameters) {
std::array<char, 2 2 2 4> payload; // Actual struct has way more parameters
int offset = 0;
bar<2, 10>(parameters.a, payload.data() offset, offset);
bar<2, 10>(parameters.b, payload.data() offset, offset);
bar<2, 10>(parameters.c, payload.data() offset, offset);
bar<4, 16>(parameters.d, payload.data() offset, offset);
return baz(payload);
}
template<size_t size, int base>
void bar(int input, char* out, int& offset) /* std::span<char, size> out (in C 20) */
{
offset = size;
// ASCII encoding with a base (2, 10 or 16)
}
template<size_t payloadSize>
Message baz(std::array<char, payloadSize> payload) {
// Some packing computation
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/517227.html
標籤:C 数组c 11铸件性病
上一篇:VisualStudio2017CMake專案中缺少VCRUNTIME140_1D.dll-我是否也需要VisualStudio2019并在舊版本的Studio中使用它?
