我有这个功能:
char *ctohex(char *str){
int i=0, len;
len = strlen(str);
char *final = malloc(len*2*sizeof(char)+1);
while(len--){
sprintf(final+i*2, "%02X", str[i]);
i++;
}
return final;
}
现在我想要一个反向函数,从十六进制到普通char,是可能的吗?对不起我的英文。没有人给我一个很好的答案,也许我解释错了。
我在我的函数中有这个输入:
JOAO
输出是:
4A4F414F
我想将4A4F414F
放回JOAO
。
答案 0 :(得分:1)
与原始ctohex()
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *hextoc(const char *str) {
size_t i, j, len;
len = strlen(str);
// If the length is not even
if (len % 2)
return NULL;
char *final = malloc(len/2 + 1);
if (final == NULL)
return NULL;
j = 0;
for (i = 0; i < len; i += 2) {
if (!isxdigit((unsigned char) str[i])
|| !isxdigit((unsigned char) str[i+1])) {
free(final);
return NULL;
}
unsigned x;
sscanf(&str[i], "%2X", &x);
final[j++] = (char) x;
}
final[j] = '\0';
return final;
}
int main() {
return puts(hextoc("4A4F414F"));
// prints JOAO
}
ctohex(char *str)
有问题。当str[i]
是&lt; 0
// sprintf(final+i*2, "%02X", str[i]);
sprintf(final+i*2, "%02X", str[i] & 0xFF);
// or
sprintf(final+i*2, "%02hhX", str[i]); // Current C compilers
答案 1 :(得分:0)
当然可以从十六进制转换为普通char。
一次检查2个字符并确定要打印的字符
if (char1 == '0' && char2 == '0') putchar(0x00);
if (char1 == '0' && char2 == '1') putchar(0x01);
/* ... */
if (char1 == '4' && char2 == '2') putchar(0x42); /* ASCII B */
/* ... */
if (char1 == 'f' && char2 == 'f') putchar(0xff);
虽然有更有效的方法:)
答案 2 :(得分:0)
在每个十六进制数
上使用base = 16的strtol()答案 3 :(得分:0)
你的主要问题是你转换为十六进制并没有真正做任何事情,因为你正在将每个数字转换为十六进制等效,这没有任何作用。十进制中的5也是十六进制中的5。你所做的只是在每个数字之间加0(“5432” - &gt;“05040302”)
如果要求在由其十六进制值表示的字符串中取一个数字,并将其作为十进制值放入字符串中,例如“0x5A8C” - &gt; “23180”,这就是你所做的:
char *convert( char * instr )
{
char outstr[50] = {0};
int tmpval = 0;
sscanf( instr, "%x", tmpval );
sprintf( outstr, "%d", tmpval );
char * retval;
strcpy( retval, outstr );
return retval;
}
使用sscanf()的好处是sscanf会同时处理0x5a
,0X5A
,5a
和5A
。
如果您只是想转换回ctohex()函数生成的任何字符串,那么您只需将每个其他数字复制到一个新字符串中。
如果要将十六进制数字序列转换为十进制值,则必须指定要转换的位数。你想要“5A8C” - &gt; “510812”或者你想要“90140”?