在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++中无法做到这一点。我愿意接受建议。你将如何解决它?我想了几个解决方案,但我不喜欢其中任何一个。

也许可以在2d数组中定义它们?还是自定义容器类?

我建议使用并返回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*的函数,那么您可以使用arraydata成员来获得类似的指针

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 };
}

最新更新