У меня есть шестнадцатеричная строка и вы хотите, чтобы она была преобразована в строку ascii в C. Как я могу выполнить это?
Преобразование шестнадцатиричных в ascii строк
Ответ 1
вам нужно взять 2 (шестнадцатеричные) символы одновременно... затем вычислить значение int и после этого сделайте преобразование char как...
char d = (char)intValue;
сделайте это для каждого 2chars в шестнадцатеричной строке
это работает, если строковые символы всего 0-9A-F:
#include <stdio.h>
#include <string.h>
int hex_to_int(char c){
int first = c / 16 - 3;
int second = c % 16;
int result = first*10 + second;
if(result > 9) result--;
return result;
}
int hex_to_ascii(char c, char d){
int high = hex_to_int(c) * 16;
int low = hex_to_int(d);
return high+low;
}
int main(){
const char* st = "48656C6C6F3B";
int length = strlen(st);
int i;
char buf = 0;
for(i = 0; i < length; i++){
if(i % 2 != 0){
printf("%c", hex_to_ascii(buf, st[i]));
}else{
buf = st[i];
}
}
}
Ответ 2
Несколько символов, таких как алфавиты i-o, не могут быть преобразованы в соответствующие символы ASCII. как в строке "6631653064316f30723161" соответствует fedora. но он дает fedra
Просто немного измените функцию hex_to_int(), и она будет работать для всех символов. измененная функция
int hex_to_int(char c)
{
if (c >= 97)
c = c - 32;
int first = c / 16 - 3;
int second = c % 16;
int result = first * 10 + second;
if (result > 9) result--;
return result;
}
Теперь попробуйте, он будет работать для всех символов.
Ответ 3
strtol()
- ваш друг здесь. Третий параметр - это числовая база, которую вы преобразовываете.
Пример:
#include <stdio.h> /* printf */
#include <stdlib.h> /* strtol */
int main(int argc, char **argv)
{
long int num = 0;
long int num2 =0;
char * str. = "f00d";
char * str2 = "0xf00d";
num = strtol( str, 0, 16); //converts hexadecimal string to long.
num2 = strtol( str2, 0, 0); //conversion depends on the string passed in, 0x... Is hex, 0... Is octal and everything else is decimal.
printf( "%ld\n", num);
printf( "%ld\n", num);
}