在 C++ 中将枚举类型转换为特定的、预定义的十六进制值数组
Converting enum type to a specific, predefined array of hex values in C++
编写返回 8 位十六进制值数组的函数的最佳和最短方法是什么,这些值是根据枚举参数分配的。
我需要对命令进行硬编码,这些命令将通过蓝牙发送并且仍然可以在代码中轻松访问它们。所以我有一个枚举,其中以人类可读的方式列出了所有可能的命令。
enum eventType {
MODIFY_A,
MODIFY_B,
MODIFY_C,
MODIFY_D
}
我尝试采用的通信协议使用具有预定义十六进制值的自定义数据包。因此,例如,发送 0x00, 0x01, 0x02, 0x03
可能会改变接收设备的 LED 颜色。
用于 ble 通信的库接受所述十六进制的数组,或者换句话说,只是一个普通的 C 字符串。
最简单的方法是在声明后在 switch() 中简单地定义一个数组,就像这样:
uint8_t* getCommandOf(eventType event) {
uint8_t command[4];
switch(event) {
case eventType::MODIFY_A:
command = {0x01, 0x00, 0x00, 0x00}; break;
case eventType::MODIFY_B:
command = {0x02, 0x00, 0x00, 0x00}; break;
case eventType::MODIFY_C:
command = {0x03, 0x00, 0x00, 0x00}; break;
case eventType::MODIFY_D:
command = {0x04, 0x00, 0x00, 0x00}; break;
}
return command;
}
然后我可以简单地调用:
sendOverBLE(getCommandOf(eventType::MODIFY_A));
不幸的是,我们不能在 C++ 中做到这一点。
我愿意接受建议。你会怎么解决?我想到了一些解决方案,但我不喜欢其中任何一个。
也许在二维数组中定义它们?或者自定义容器 class?
我建议使用并返回 std::array
。那会将您的功能更改为
std::array<uint8_t, 4> getCommandOf(eventType event) {
switch(event) {
case eventType::MODIFY_A:
return {0x01, 0x00, 0x00, 0x00};
case eventType::MODIFY_B:
return {0x02, 0x00, 0x00, 0x00};
case eventType::MODIFY_C:
return {0x03, 0x00, 0x00, 0x00};
case eventType::MODIFY_D:
return {0x04, 0x00, 0x00, 0x00};
}
// for bad input
return {}; // for all zeros
// or use an exception
throw std::invalid_argument("some error message here");
}
如果你需要将这个数组传递给一个接受uint8_t*
的函数,那么你可以使用array
的data
成员来得到这样一个指针,比如[=17] =]
my_uint8_t_ptr_func(getCommandOf(eventType::MODIFY_A).data());
如果您可以完全控制您的 enum
,您可以按如下方式定义它:
enum eventType : uint8_t {
MODIFY_A = 1,
MODIFY_B,
MODIFY_C,
MODIFY_D
}
那么你的函数可以是:
std::array<uint8_t, 4> getCommandOf(eventType event) {
return { event, 0, 0, 0 };
}
编写返回 8 位十六进制值数组的函数的最佳和最短方法是什么,这些值是根据枚举参数分配的。
我需要对命令进行硬编码,这些命令将通过蓝牙发送并且仍然可以在代码中轻松访问它们。所以我有一个枚举,其中以人类可读的方式列出了所有可能的命令。
enum eventType {
MODIFY_A,
MODIFY_B,
MODIFY_C,
MODIFY_D
}
我尝试采用的通信协议使用具有预定义十六进制值的自定义数据包。因此,例如,发送 0x00, 0x01, 0x02, 0x03
可能会改变接收设备的 LED 颜色。
用于 ble 通信的库接受所述十六进制的数组,或者换句话说,只是一个普通的 C 字符串。
最简单的方法是在声明后在 switch() 中简单地定义一个数组,就像这样:
uint8_t* getCommandOf(eventType event) {
uint8_t command[4];
switch(event) {
case eventType::MODIFY_A:
command = {0x01, 0x00, 0x00, 0x00}; break;
case eventType::MODIFY_B:
command = {0x02, 0x00, 0x00, 0x00}; break;
case eventType::MODIFY_C:
command = {0x03, 0x00, 0x00, 0x00}; break;
case eventType::MODIFY_D:
command = {0x04, 0x00, 0x00, 0x00}; break;
}
return command;
}
然后我可以简单地调用:
sendOverBLE(getCommandOf(eventType::MODIFY_A));
不幸的是,我们不能在 C++ 中做到这一点。 我愿意接受建议。你会怎么解决?我想到了一些解决方案,但我不喜欢其中任何一个。
也许在二维数组中定义它们?或者自定义容器 class?
我建议使用并返回 std::array
。那会将您的功能更改为
std::array<uint8_t, 4> getCommandOf(eventType event) {
switch(event) {
case eventType::MODIFY_A:
return {0x01, 0x00, 0x00, 0x00};
case eventType::MODIFY_B:
return {0x02, 0x00, 0x00, 0x00};
case eventType::MODIFY_C:
return {0x03, 0x00, 0x00, 0x00};
case eventType::MODIFY_D:
return {0x04, 0x00, 0x00, 0x00};
}
// for bad input
return {}; // for all zeros
// or use an exception
throw std::invalid_argument("some error message here");
}
如果你需要将这个数组传递给一个接受uint8_t*
的函数,那么你可以使用array
的data
成员来得到这样一个指针,比如[=17] =]
my_uint8_t_ptr_func(getCommandOf(eventType::MODIFY_A).data());
如果您可以完全控制您的 enum
,您可以按如下方式定义它:
enum eventType : uint8_t {
MODIFY_A = 1,
MODIFY_B,
MODIFY_C,
MODIFY_D
}
那么你的函数可以是:
std::array<uint8_t, 4> getCommandOf(eventType event) {
return { event, 0, 0, 0 };
}