“size_t strlen(const char *)”: 无法将参数 1 从“BYTE [1500]”转换为“const char *”
时间: 2023-11-21 08:05:20 浏览: 37
这是因为参数 1 的类型是 BYTE 数组,而不是 const char *。在这种情况下,您需要先将 BYTE 数组转换为 const char *,然后将其传递给 strlen 函数。您可以使用类型转换操作符来进行转换。例如,在函数调用中使用以下代码:
strlen(reinterpret_cast<const char*>(byte_array));
其中 byte_array 是 BYTE 数组的名称。这将把 BYTE 数组转换为 const char *,并将其传递给 strlen 函数。
相关问题
编写一子函数,进行字符串解析 /* Internet address. */ struct in_addr { uint32_t s_addr; /* address in network byte order */ }; char *inet_ntoa(struct in_addr in); #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> int main(int argc,const char * argv[]) { //argv[1]---"192.168.2.68" //argv[2]---"8888" struct sockaddr_in client;//通过网络获得客户端的地址 printf("客户端的IP地址:%S",inet_ntoa(client.sin_addr)); printf("端口号:%d\n",ntohs(client.sin_port)); return 0; } "zhangsan#123456#" "zhangsan" "123456" 参数:3个 参数1:你要解析的字符串 const char * 参数2:解析会获得用户名字符串char * 参数3:解析会获得密码字符串 char * 返回值:成功返回1,失败返回0
下面是一个简单的字符串解析函数,可以解析出两个#号之间的字符串作为用户名,以及第二个#号之后的字符串作为密码:
```c
int parse_string(const char *str, char *username, char *password) {
int i, j, len = strlen(str);
for (i = 0; i < len; i++) {
if (str[i] == '#') {
for (j = i + 1; j < len; j++) {
if (str[j] == '#') {
strncpy(username, str, i);
username[i] = '\0';
strncpy(password, str + j + 1, len - j - 1);
password[len - j - 1] = '\0';
return 1;
}
}
break;
}
}
return 0;
}
```
使用方法如下:
```c
char str[] = "zhangsan#123456#";
char username[20], password[20];
if (parse_string(str, username, password)) {
printf("username: %s\n", username);
printf("password: %s\n", password);
} else {
printf("failed to parse string\n");
}
```
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<openssl/hmac.h> char *signature_calculate(char *json_obj, char *key){ unsigned char *key_byte = (unsigned char *)key; char *sorted_json = to_url_query(json_obj); unsigned char *dataddd = (unsigned char *)sorted_json; unsigned char *signature = HMAC(EVP_sha256(), key_byte, strlen(key), dataddd, strlen(dataddd), NULL, NULL); char hex_signature = malloc(2 * EVP_MAX_MD_SIZE + 1); for(int i=0; i<EVP_MAX_MD_SIZE; i++) { sprintf(&hex_signature[i2], "%02x", signature[i]); } return hex_signature; } typedef struct { char key[256]; char value[256]; } KeyValue; int compare(const void a, const void b) { return strcmp(((KeyValue)a)->key, ((KeyValue)b)->key); } char *sort_dict(KeyValue *array, int size) { // 对KeyValue数组按ASCII码升序排序 qsort(array, size, sizeof(KeyValue), compare); char *query_list = malloc(size * 256); int len=0; for(int i=0; i<size; i++) { if(strlen(array[i].value)==0){ // 如果值为空或者空字符串则不拼接 continue; } char *key = array[i].key; char *value = array[i].value; if(isalpha(value[0]) && isalnum(value[1]) && strcmp(value, "true")!=0 && strcmp(value, "false")!=0) { sprintf(&query_list[len], "%s=%s&", key, value); } else { sprintf(&query_list[len], "%s="%s"&", key, value); } len = strlen(query_list); } if(len>0) { query_list[len-1] = 0; } return query_list; } char *to_url_query(char *json, char *prefix){ // 将json字符串转换为URL键值对形式的字符串 int len = strlen(json); KeyValue *array = malloc(len * sizeof(KeyValue)); int i=0; int j=0; int level=0; char *key; // 处理嵌套字典的键名 while(i<len){ if(json[i]=='{' || json[i]=='['){ level++; i++; } else if(json[i]=='}' || json[i]==']'){ level--; i++; } else if(json[i]==','){ array[j].value[i-array[j].key] = 0; i++; j++; } else if(json[i]==':'){ key = array[j].key; array[j].value[0] = 0; i++; } else if(json[i]=='"' && level%2==0){ i++; int k=0; while(json[i]!='"') { array[j].value[k] = json[i]; i++; k++; } array[j].value[k] = 0; i++; } else if(json[i]!=',' && json[i]!=':' && json[i]!=' '){ array[j].key[i-j] = json[i]; i++; } else { i++; } } array[j].value[i-array[j].key] = 0; j++; char *sorted_json = sort_dict(array, j); char *query_list = malloc(strlen(sorted_json)+1); if(strlen(prefix)>0){ sprintf(query_list, "%s.%s", prefix, sorted_json); } else { strcpy(query_list, sorted_json); } free(array); free(sorted_json); return query_list; } 请对上面的代码添加注释
```
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<openssl/hmac.h>
// 计算签名函数,接收一个JSON字符串和一个密钥字符串,返回一个签名字符串
char *signature_calculate(char *json_obj, char *key){
// 将密钥转换为unsigned char类型的指针
unsigned char *key_byte = (unsigned char *)key;
// 将JSON字符串转换为URL键值对形式的字符串
char *sorted_json = to_url_query(json_obj);
// 将URL键值对形式的字符串转换为unsigned char类型的指针
unsigned char *dataddd = (unsigned char *)sorted_json;
// 使用OpenSSL库的HMAC函数计算签名
unsigned char *signature = HMAC(EVP_sha256(), key_byte, strlen(key), dataddd, strlen(dataddd), NULL, NULL);
// 将签名字符串转换为十六进制形式的字符串并返回
char hex_signature = malloc(2 * EVP_MAX_MD_SIZE + 1);
for(int i=0; i<EVP_MAX_MD_SIZE; i++) {
sprintf(&hex_signature[i2], "%02x", signature[i]);
}
return hex_signature;
}
// 定义一个键值对结构体类型,用于存储键值对
typedef struct {
char key[256];
char value[256];
} KeyValue;
// 对KeyValue数组按ASCII码升序排序的比较函数
int compare(const void a, const void b) {
return strcmp(((KeyValue)a)->key, ((KeyValue)b)->key);
}
// 将KeyValue数组按ASCII码升序排序并拼接成URL键值对形式的字符串
char *sort_dict(KeyValue *array, int size) {
// 对KeyValue数组按ASCII码升序排序
qsort(array, size, sizeof(KeyValue), compare);
// 初始化一个字符串,用于存储拼接后的URL键值对形式的字符串
char *query_list = malloc(size * 256);
int len=0;
for(int i=0; i<size; i++) {
// 如果值为空或者空字符串则不拼接
if(strlen(array[i].value)==0){
continue;
}
char *key = array[i].key;
char *value = array[i].value;
// 如果值是字母或数字,则直接拼接
if(isalpha(value[0]) && isalnum(value[1]) && strcmp(value, "true")!=0 && strcmp(value, "false")!=0) {
sprintf(&query_list[len], "%s=%s&", key, value);
} else { // 否则需要将值加上双引号再拼接
sprintf(&query_list[len], "%s="%s"&", key, value);
}
len = strlen(query_list);
}
// 去掉最后一个&符号
if(len>0) {
query_list[len-1] = 0;
}
return query_list;
}
// 将JSON字符串转换为URL键值对形式的字符串
char *to_url_query(char *json, char *prefix){
// 计算JSON字符串的长度
int len = strlen(json);
// 初始化一个KeyValue数组,用于存储键值对
KeyValue *array = malloc(len * sizeof(KeyValue));
int i=0;
int j=0;
int level=0;
char *key;
// 处理嵌套字典的键名
while(i<len){
if(json[i]=='{' || json[i]=='['){ // 如果遇到{或[,则进入下一层级
level++;
i++;
} else if(json[i]=='}' || json[i]==']'){ // 如果遇到}或],则退出上一层级
level--;
i++;
} else if(json[i]==','){ // 如果遇到逗号,则处理下一个键值对
array[j].value[i-array[j].key] = 0;
i++;
j++;
} else if(json[i]==':'){ // 如果遇到冒号,则表示下一个字符串是值,保存键名
key = array[j].key;
array[j].value[0] = 0;
i++;
} else if(json[i]=='"' && level%2==0){ // 如果遇到双引号,则表示下一个字符串是键名或值
i++;
int k=0;
while(json[i]!='"') { // 保存双引号之间的字符串
array[j].value[k] = json[i];
i++;
k++;
}
array[j].value[k] = 0;
i++;
} else if(json[i]!=',' && json[i]!=':' && json[i]!=' '){ // 如果不是逗号、冒号或空格,则表示当前字符是键名的一部分
array[j].key[i-j] = json[i];
i++;
} else { // 否则忽略当前字符
i++;
}
}
// 保存最后一个键值对的值
array[j].value[i-array[j].key] = 0;
j++;
// 将KeyValue数组按ASCII码升序排序并拼接成URL键值对形式的字符串
char *sorted_json = sort_dict(array, j);
// 初始化一个字符串,用于存储拼接后的URL键值对形式的字符串
char *query_list = malloc(strlen(sorted_json)+1);
if(strlen(prefix)>0){ // 如果有前缀,则在拼接后的字符串前加上前缀
sprintf(query_list, "%s.%s", prefix, sorted_json);
} else { // 否则直接返回拼接后的字符串
strcpy(query_list, sorted_json);
}
// 释放内存
free(array);
free(sorted_json);
return query_list;
}
```