在 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*的函数,那么你可以使用arraydata成员来得到这样一个指针,比如[=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 };
}