我有一个hex
字符串,格式为“404C49474854”。
我试图用以下方法从中提取文本字符串:
void textFromHexString(char *hex,char *result)
{
for(int k=1;k<strlen(hex);k+=2)
{
char temp[3]={0};
sprintf(temp,"%c%c",hex[k-1],hex[k]);
*result=char((int)strtol(temp, NULL, 16));
result++;
*result ='\0';
print(temp); //**** edit
}
}
我从另一个函数中调用它,使用:
void somefunction()
{
// I have p here, which prints "404C49474854"
char text[TEXT_MAX_SIZE]={0};
textFromHexString(p,text);
}
它有效,但 80%的时间都有效。在某些情况下它会崩溃,其中:
-incoming hex
指针是:"404C49474854"
。 肯定。
- 指针temp
获得一个甚至不在hex
内的其他值。
这种方法有什么问题吗?
修改 检查在循环内打印的行的位置,它将在非常特定的情况下打印出来:
4Hello, world
仅由数字组成的temp
如何获取此字符串? (“Hello world”,只是我在程序开头打印的字符串,也是临时大小为3)
答案 0 :(得分:0)
您可以使用sscanf()
直接读取给定长度的十六进制数字,如下所示:
while(hex[0] && hex[1]) {
int value;
sscanf(hex, "%2x", &value);
printf("%c", value);
hex += 2;
}
printf("\n");
答案 1 :(得分:0)
似乎评论者发现了大多数错误,所以这里的代码可以假设我猜对了你想要的东西。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
// ALL CHECKS OMMITTED!
void textFromHexString(char *hex, char result[])
{
// work on copy
char *p = result;
// this has more steps than necessary for clarity
for (size_t k = 1; k < strlen(hex); k += 2) {
// normalize input
char first = tolower(hex[k - 1]);
char second = tolower(hex[k]);
// convert hexbyte to decimal number
int f1 = (isdigit(first)) ? first - '0' : (first - 'a') + 10;
int f2 = (isdigit(second)) ? second - '0' : (second - 'a') + 10;
// two byte number from LSB hex to decimal (e.g.: "ab" = 171)
int num = f1 * 16 + f2;
// needs to store min. 3 characters plus NUL
char temp[4] = { 0 };
// sprintf is a bit too much for it but simple
sprintf(temp, "%d", num);
// concatenate temp to the result-string
strcat(p, temp);
// For debugging, I guess, or further work?
printf("%s\n", temp);
}
}
#define TEXT_MAX_SIZE 64
int main()
{
// 0x404C49474854 = 70696391100500
char *p = "404C49474854";
// allocate some scratchspace on the stack
char text[TEXT_MAX_SIZE] = { 0 };
textFromHexString(p, text);
// the function textFromHexString() does it in chunks of two bytes,
// so the result is 647673717284 here
printf("Result: %s\n", text);
exit(EXIT_SUCCESS);
}