我有一个带输入参数的函数" text" ,由一个字符串组成,该字符串包含由空格分隔的未知数量的2个字符的十六进制数字。我需要读取它们并将它们放在单独的数组索引中或者在for循环中读取它们并逐个使用它们。这些值中的每一个都表示加密的char(十六进制值是字符的ascii值)。我怎么能这样做?我想我应该使用sscanf();但我无法弄清楚如何做到这一点。
char* bit_decrypt(const char* text){
int size=strlen(text)/3;
unsigned int hex[size];
char*ptr;
for(int i=0; i<size+1; i++){
hex[i] = strtoul(text, &ptr, 16);
printf("%x ",hex[i]);
}
return NULL;
}
output is: "80 80 80 80 80 80 80 80 80 80 80 80"
should be: "80 9c 95 95 96 11 bc 96 b9 95 9d 10"
答案 0 :(得分:0)
您始终扫描text
的第一个值,因为您忘记在上一次扫描结束后立即移动strtoul
的输入。这就是**end
- strtoul
参数的优点:它指向成功扫描的最后一位数后面的字符。注意:如果没有读入任何内容,则end
- 指针与输入指针相等,这表示“格式错误编号”或字符串结尾。请参阅以下程序说明这一点。希望它有所帮助。
int main() {
const char* input = "80 9c 95 95 96 11 bc 96 b9 95 9d 10";
const char *current = input;
char *end = NULL;
while (1) {
unsigned long val = strtoul(current, &end, 16);
if (current == end) // invalid input or end of string reached
break;
printf("val: %lX\n", val);
current = end;
}
}
答案 1 :(得分:0)
这也是使用strchr
和strtoul(tmp,NULL,16);
在您的解决方案中,请记住size_t arr_len = (len/3) + 1;
,因为最后一个令牌只有2
个字节。
输入text
令牌将转换为字节并存储在char array
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char text[] = "80 9c 95 95 96 11 bc 96 b9 95 9d 10";
size_t len = strlen(text);
size_t arr_len = (len/3) + 1;
printf("len= %zu arr_len= %zu\n", len, arr_len);
printf("Text:\n%s\n", text);
char array[arr_len];
const char *p1 = text;
char tmp[3];
tmp[2] = 0;
printf("Parsing:\n");
for(size_t i=0; i< arr_len; i++)
{
p1 = strchr(p1,' ');
if(p1)
{
tmp[0] = *(p1-2);
tmp[1] = *(p1-1);
array[i]= (char)strtoul(tmp,NULL,16);
printf("%2x ", (unsigned char) array[i]);
p1++;
if(strlen(p1) == 2 ) // the last char
{
i++;
tmp[0] = *(p1);
tmp[1] = *(p1+1);
array[i]= (char)strtoul(tmp,NULL,16);
printf("%2x", (unsigned char) array[i]);
}
}
}
printf("\nArray content:\n");
for(size_t i=0; i< arr_len; i++)
{
printf("%2x ", (unsigned char) array[i]);
}
return 0;
}
测试:
len= 35 arr_len= 12
Text:
80 9c 95 95 96 11 bc 96 b9 95 9d 10
Parsing:
80 9c 95 95 96 11 bc 96 b9 95 9d 10
Array content:
80 9c 95 95 96 11 bc 96 b9 95 9d 10