如何在C中将char指针转换为__uint8_t数组?

时间:2017-12-06 20:18:40

标签: c

我需要将字符串(char *)转换为__uint8_t数组。我知道后者是unsigned char的别名,但我无法弄清楚如何正确转换它。

示例:

char *ssid = "XXXXX";

这是必要的,因为我必须调用一个只接受__uint8_t数组的API,而不是char *。

struct WifiConfig {
    uint8_t ssid[32];
    uint8_t password[64];
};

struct WifiConfig wifi_config;
wifi_config.ssid = ???

如果我试图施放:

wifi_config.ssid = (__uint8_t *) ssid;

我收到以下错误:

error: assignment to expression with array type
     wifi_config.ssid = (__uint8_t *) ssid;

对不起,如果这是一个愚蠢的问题,上次我和C一起玩的时候,我还是个孩子。

提前致谢!

2 个答案:

答案 0 :(得分:3)

刚演员:

const char *name = "My Full Name";
yourAPIFunction((__uint8_t *) name);

注意:这违反了const-correctness。您必须确保yourAPIFunction不会改变name。如果确实如此,那么您需要memcpy(和free!)它到一个局部变量,并提供它,因此它的突变不会影响汇集字符串由"My Full Name"的任何其他用户使用。

对您(完全不同的)更新问题的回复:

这些数组的存储内联,它们不像典型的char *那样指向堆的指针。你需要将字符串的内容复制到它们中:

// ssid must be at most 31 chars (plus NUL terminator)
// password must be at most 63 chars (plus NUL terminator)
struct WifiConfig new_wifi_config(char *ssid, char *password) {
    struct WifiConfig wifi_config;
    memcpy(wifi_config.ssid, ssid, strlen(ssid)+1)
    memcpy(wifi_config.password, ssid, strlen(ssid)+1)
    return wifi_config;
}

答案 1 :(得分:0)

  

我需要将字符串(char *)转换为__uint8_t数组。我知道   后者是unsigned char的别名,但我无法弄清楚如何   正确地转换它。

迂腐 - 因为这里很重要 - C字符串是而不是 a char *。相反,它是char的以null结尾的数组。主要通过char *类型的指针来访问和处理它们,主要是因为这是C语言中数组的工作方式。

因此,不,您不希望将char *转换为数组。看来你想要做的是复制它所指向的数组的内容。出于特定目的,我将使用strncpy()函数:

strncpy((char *) wifi_config.ssid, ssid, sizeof(wifi_config.ssid));

请注意,使用该代码,如果ssid长于wifi_config.ssid可以容纳,那么后者最终将被终止,否则其尾部将填充空字节。给定该数组的类型,这种行为可能正好需要什么。但是,如果要确保空终止,则只需在strncpy()之后用0覆盖数组的最后一个字节。