将char * in hex转换为普通char *?

时间:2014-03-11 23:18:12

标签: c string hex

我有这个功能:

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

4 个答案:

答案 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会同时处理0x5a0X5A5a5A

如果您只是想转换回ctohex()函数生成的任何字符串,那么您只需将每个其他数字复制到一个新字符串中。

如果要将十六进制数字序列转换为十进制值,则必须指定要转换的位数。你想要“5A8C” - &gt; “510812”或者你想要“90140”?