求C语言16进制字符串转化成字符串的方法。100分!

时间:2023-01-07 10:17:08
我有一段类似这样的字符串:"7C7C307C724C7C267C7C7C7C7C3A7C417C7C7" 其中每两位两位的代表一个字符,类似:“7C”对应“|”、“24”对应“$”、“41”对应“A”、“26”对应“&”等等。。。想用纯C写这样一个函数,跪求大神帮忙,求思路求代码!

24 个解决方案

#1


这个用“查表”方式就可以了吧

#2


如果翻译的类型少的话,可以这样。利用查询法,每次从字符串里取出两个字符到一个变量里,然后用strcmp比较该变量与翻译前的字符(即7C,24,41等)比较,如果相等就翻译成对应的变量。

#3



#include <stdio.h>

char a2x(char ch)
{
switch(ch)
{
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
case 'a':
return 10;
case 'B':
case 'b':
return 11;
case 'C':
case 'c':
return 12;
case 'D':
case 'd':
return 13;
case 'E':
case 'e':
return 14;
case 'F':
case 'f':
return 15;
default:
break;;
}

return 0;
}

int main(int argc, char* argv[])
{
char str1[] = "7C7C307C724C7C267C7C7C7C7C3A7C417C7C7";
char str2[81];
char ch;
int i;

i = 0;
while(str1[i])
{
str2[i >> 1] = (a2x(str1[i]) << 4) | a2x(str1[i + 1]);
i += 2;
}
str2[i >> 1] = '\0';

printf("%s\n", str2);

return 0;
}

#4


char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&v);
 s[i]=(char)(v&0xFFu);
}
s[i]=0;
printf("%s\n",s);

L=strlen(s);
for (i=0;i<L;i++) sprintf(hex+2*i,"%02X",(unsigned char)s[i]);
hex[2*i+2]=0;
printf("%s\n",hex);
"

#5


读字符,转数据,设Bit
就是ASCII码,不需要查表

思路就这样,代码没有,以上

#6


楼主可以看看这个:


#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    char st[]="7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C";
    int ch[strlen(st)/2];
    char c[strlen(st)/2];
    printf("十六进制 十进制   字符\n");
    for(int i=0;i<strlen(st);i=i+2)
    {

            ch[i/2]=((st[i]<64?st[i]-48:st[i]-55)*16)+(st[i+1]<64?st[i+1]-48:st[i+1]-55);
            c[i/2]=ch[i/2];
            printf("  %c%c   ",st[i],st[i+1]);
            printf("  %5d",ch[i/2]);
            printf("  %5c\n",c[i/2]);      
    }
}

#7


自己写的,贡献出来交流交流,代码如下:

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    char st[]="7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C";
    int ch[strlen(st)/2];
    char c[strlen(st)/2];
    printf("十六进制 十进制   字符\n");
    for(int i=0;i<strlen(st);i=i+2)
    {

            ch[i/2]=((st[i]<64?st[i]-48:st[i]-55)*16)+(st[i+1]<64?st[i+1]-48:st[i+1]-55);
            c[i/2]=ch[i/2];
            printf("  %c%c   ",st[i],st[i+1]);
            printf("  %5d",ch[i/2]);
            printf("  %5c\n",c[i/2]);      
    }
}

#8


//将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,
//返回转换后的字节数组长度,同时字节数组长度自动设置。
int CMHT_VTest::Str2Hex(CString str, char* data)  //与接受消息无关
{
int t,t1;
int rlen=0,len=str.GetLength();
//data.SetSize(len/2);
for(int i=0;i<len;)
{
char l,h=str[i];
if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))
break;
else 
t=t*16+t1;
i++;
data[rlen]=(char)t;
rlen++;
}
return rlen;
}

#9


char CMHT_VTest::HexChar(char c)//与接受消息无关
{
if((c>='0')&&(c<='9'))
return c-0x30;
else if((c>='A')&&(c<='F'))
return c-'A'+10;
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else 
return 0x10;
}

#10


这几天正好在处理串口方面的问题,涉及到这个,就给你转过来了。我这边用着没有问题。试试吧。 

#11


void ShowStr(char *sStr);

void main()
{
    ShowStr("7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C\0");
}

void ShowStr(char *sStr)
{
char tStr[3];            //临时字串
char ch;                 //转变后字符
int  n=0;                //原字串计数
if(sStr==NULL) return;   //空串就不操心了

while(1)
{
tStr[0]=sStr[n];        //取1个字符到临时串
if(tStr[0]==0) break;    //如果该字符为零,表示原字串已经取完
n++;                  
tStr[1]=sStr[n];        //再取1个字符到临时串
n++;
tStr[2]=0;               //临时串的第3个字符坚决为0

sscanf(tStr,"%x",&ch);   //将临时串以16进制方式给转变字符赋值
printf("%c",ch);         //输出ch对应的字符

if(tStr[1]==0) break;     //如果临时串第2字符为零,表示最后一个数据是单的,原字串已经取完
}

printf("\n");      //附加赠送,完成后换一行
}

#12


#include <stdio.h>
#include <string.h>
#include <math.h>

char FromStrToChar(char *str)
{
if(NULL == str)
return '\0';

//对应十六进制数据
int a[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

unsigned int i,sum = 0;

for(i = 0; i < 2; ++ i)
{
if(str[i] >= '0' && str[i] <= '9')
{
sum += a[str[i] - '0'] * (16/pow(16,i));
}
else
{
sum += a[str[i] - 'A' + 10] * (16/pow(16,i));
}
}

return (char)sum;

}

void StringConvert(char *str)
{
unsigned int len = strlen(str);
if(len & 1)
{
//字符串数目为奇数,编码有问题,自动清空
//你可以根据自己情况处理
*str = '\0';
return ;
}

unsigned int i, nCount = 0;
char a[3] = {0};

for(i = 0; i < len / 2; ++ i)
{
a[0] = str[i*2];//第一位
a[1] = str[i*2 + 1];//第二位
a[2] = '\0';

str[nCount ++] = FromStrToChar(a);
}
str[nCount] = '\0';
}

void main()
{
char str[] = "7C7C307C724C7C267C7C7C7C7C3A7C417C7C";

StringConvert(str);

printf("%s\n",str);

}


以上代码通过测试,LZ可以根据自己的情况稍作处理。

#13


程序没什么难度,大家都能写出来.
我来挑战一下代码长度吧 求C语言16进制字符串转化成字符串的方法。100分!.
#include <stdio.h>
void h2s(const char *s, char *o) {
  // 计算代码共108个字符,应该还能精简
  for(int i=0,c;c=s[i];++i)(o[i/2]*=(i%2)*16)+=c<'0'?0:c<':'?c-'0':c<'A'?0:c<'G'?c-'7':c<'a'?0:c<'g'?c-'W':0;
}
int main() {
  char o[256] = {0};
  h2s("7C7C307C724C7C267C7C7C7C7C3A7C417C7C",o);
  puts(o);
  return 0;
}

#14


完全不考虑校验,这样也可以...63个字符
void h2s(const char *s, char *o) {
for(int i=0,c;c=s[i];++i)(o[i/2]*=i<<4&16)+=(c/16<4?c:c+9)&15;
}

#15


该回复于2012-08-18 15:48:46被版主删除

#16


引用 4 楼  的回复:
char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;v);
 s[i]=(char)(v&amp;0xFFu);
}
s[i]=0;
printf……


这么久才来回复,实在不应该。您的方法是最为简洁且功能完美实现的,谢谢。不过我“s[i]=(char)(v&amp;0xFFu);”这句不是很理解,能帮我解释一下吗?

#17


引用 13 楼  的回复:
程序没什么难度,大家都能写出来.
我来挑战一下代码长度吧.
C/C++ code
#include <stdio.h>
void h2s(const char *s, char *o) {
  // 计算代码共108个字符,应该还能精简
  for(int i=0,c;c=s[i];++i)(o[i/2]*=(i%2)*16)+=c<'0'?0:c<':'?c-'0':c<'A'?0:c<……

您的代码确实很简洁,但是不知为何,我在linux下去编译会报错的呢?

#18


引用 16 楼  的回复:
引用 4 楼 的回复:

char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;amp;v);
 s[i]=(char)(v&amp;amp;0xFFu……

s[i]=(char)(v&0xFFu);
将int类型的v按位与0x000000FFu这个无符号十六进制数FF,即v除以256的余数,强制类型转换为char类型之后,赋值给元素类型为char类型的数组s的第i个元素。

#19


引用 18 楼  的回复:
引用 16 楼  的回复:
引用 4 楼 的回复:

char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;amp;amp;v);
 s[i]=(c……
赵老师请教你个问题,如果原始数据在文件中是16进制的,比如00 37 31 34 35 39这样的,该怎么处理啊?希望你能帮帮忙

#20


引用 19 楼 qsdychl000000 的回复:
[Quote=引用 18 楼  的回复:]

引用 16 楼  的回复:
引用 4 楼 的回复:

char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;amp;amp;v);
 s[i]=(c……
赵老师请教你个问题,如果原始数据在文件中是16进制的,比如00 37 31 34 35 39这样的,该怎么处理啊?希望你能帮帮忙
你可以用先循环判断去掉空格,结果用一个字符串来存储,然后再使用strcpy

#21


你们的代码自己测试了吗?就都贴上来了,全是毛病,就3楼的一次性通过了。这就是砖家!

#22


引用 11 楼 gz_qmc 的回复:
void ShowStr(char *sStr);

void main()
{
    ShowStr("7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C\0");
}

void ShowStr(char *sStr)
{
char tStr[3];            //临时字串
char ch;                 //转变后字符
int  n=0;                //原字串计数
if(sStr==NULL) return;   //空串就不操心了

while(1)
{
tStr[0]=sStr[n];        //取1个字符到临时串
if(tStr[0]==0) break;    //如果该字符为零,表示原字串已经取完
n++;                  
tStr[1]=sStr[n];        //再取1个字符到临时串
n++;
tStr[2]=0;               //临时串的第3个字符坚决为0

sscanf(tStr,"%x",&ch);   //将临时串以16进制方式给转变字符赋值
printf("%c",ch);         //输出ch对应的字符

if(tStr[1]==0) break;     //如果临时串第2字符为零,表示最后一个数据是单的,原字串已经取完
}

printf("\n");      //附加赠送,完成后换一行
}


用了 崩溃 。。。。 求C语言16进制字符串转化成字符串的方法。100分!

#23


引用 14 楼 redleaves 的回复:
完全不考虑校验,这样也可以...63个字符
void h2s(const char *s, char *o) {
for(int i=0,c;c=s[i];++i)(o[i/2]*=i<<4&16)+=(c/16<4?c:c+9)&15;
}


用了 崩溃 。。

#24


引用 13 楼 redleaves 的回复:
程序没什么难度,大家都能写出来.
我来挑战一下代码长度吧 求C语言16进制字符串转化成字符串的方法。100分!.
#include <stdio.h>
void h2s(const char *s, char *o) {
  // 计算代码共108个字符,应该还能精简
  for(int i=0,c;c=s[i];++i)(o[i/2]*=(i%2)*16)+=c<'0'?0:c<':'?c-'0':c<'A'?0:c<'G'?c-'7':c<'a'?0:c<'g'?c-'W':0;
}
int main() {
  char o[256] = {0};
  h2s("7C7C307C724C7C267C7C7C7C7C3A7C417C7C",o);
  puts(o);
  return 0;
}


其中的for(int i = 0, c..)是什么意思??是初始化条件是int i = 0和C为有值的意思吗?

#1


这个用“查表”方式就可以了吧

#2


如果翻译的类型少的话,可以这样。利用查询法,每次从字符串里取出两个字符到一个变量里,然后用strcmp比较该变量与翻译前的字符(即7C,24,41等)比较,如果相等就翻译成对应的变量。

#3



#include <stdio.h>

char a2x(char ch)
{
switch(ch)
{
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
case 'a':
return 10;
case 'B':
case 'b':
return 11;
case 'C':
case 'c':
return 12;
case 'D':
case 'd':
return 13;
case 'E':
case 'e':
return 14;
case 'F':
case 'f':
return 15;
default:
break;;
}

return 0;
}

int main(int argc, char* argv[])
{
char str1[] = "7C7C307C724C7C267C7C7C7C7C3A7C417C7C7";
char str2[81];
char ch;
int i;

i = 0;
while(str1[i])
{
str2[i >> 1] = (a2x(str1[i]) << 4) | a2x(str1[i + 1]);
i += 2;
}
str2[i >> 1] = '\0';

printf("%s\n", str2);

return 0;
}

#4


char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&v);
 s[i]=(char)(v&0xFFu);
}
s[i]=0;
printf("%s\n",s);

L=strlen(s);
for (i=0;i<L;i++) sprintf(hex+2*i,"%02X",(unsigned char)s[i]);
hex[2*i+2]=0;
printf("%s\n",hex);
"

#5


读字符,转数据,设Bit
就是ASCII码,不需要查表

思路就这样,代码没有,以上

#6


楼主可以看看这个:


#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    char st[]="7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C";
    int ch[strlen(st)/2];
    char c[strlen(st)/2];
    printf("十六进制 十进制   字符\n");
    for(int i=0;i<strlen(st);i=i+2)
    {

            ch[i/2]=((st[i]<64?st[i]-48:st[i]-55)*16)+(st[i+1]<64?st[i+1]-48:st[i+1]-55);
            c[i/2]=ch[i/2];
            printf("  %c%c   ",st[i],st[i+1]);
            printf("  %5d",ch[i/2]);
            printf("  %5c\n",c[i/2]);      
    }
}

#7


自己写的,贡献出来交流交流,代码如下:

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    char st[]="7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C";
    int ch[strlen(st)/2];
    char c[strlen(st)/2];
    printf("十六进制 十进制   字符\n");
    for(int i=0;i<strlen(st);i=i+2)
    {

            ch[i/2]=((st[i]<64?st[i]-48:st[i]-55)*16)+(st[i+1]<64?st[i+1]-48:st[i+1]-55);
            c[i/2]=ch[i/2];
            printf("  %c%c   ",st[i],st[i+1]);
            printf("  %5d",ch[i/2]);
            printf("  %5c\n",c[i/2]);      
    }
}

#8


//将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,
//返回转换后的字节数组长度,同时字节数组长度自动设置。
int CMHT_VTest::Str2Hex(CString str, char* data)  //与接受消息无关
{
int t,t1;
int rlen=0,len=str.GetLength();
//data.SetSize(len/2);
for(int i=0;i<len;)
{
char l,h=str[i];
if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))
break;
else 
t=t*16+t1;
i++;
data[rlen]=(char)t;
rlen++;
}
return rlen;
}

#9


char CMHT_VTest::HexChar(char c)//与接受消息无关
{
if((c>='0')&&(c<='9'))
return c-0x30;
else if((c>='A')&&(c<='F'))
return c-'A'+10;
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else 
return 0x10;
}

#10


这几天正好在处理串口方面的问题,涉及到这个,就给你转过来了。我这边用着没有问题。试试吧。 

#11


void ShowStr(char *sStr);

void main()
{
    ShowStr("7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C\0");
}

void ShowStr(char *sStr)
{
char tStr[3];            //临时字串
char ch;                 //转变后字符
int  n=0;                //原字串计数
if(sStr==NULL) return;   //空串就不操心了

while(1)
{
tStr[0]=sStr[n];        //取1个字符到临时串
if(tStr[0]==0) break;    //如果该字符为零,表示原字串已经取完
n++;                  
tStr[1]=sStr[n];        //再取1个字符到临时串
n++;
tStr[2]=0;               //临时串的第3个字符坚决为0

sscanf(tStr,"%x",&ch);   //将临时串以16进制方式给转变字符赋值
printf("%c",ch);         //输出ch对应的字符

if(tStr[1]==0) break;     //如果临时串第2字符为零,表示最后一个数据是单的,原字串已经取完
}

printf("\n");      //附加赠送,完成后换一行
}

#12


#include <stdio.h>
#include <string.h>
#include <math.h>

char FromStrToChar(char *str)
{
if(NULL == str)
return '\0';

//对应十六进制数据
int a[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

unsigned int i,sum = 0;

for(i = 0; i < 2; ++ i)
{
if(str[i] >= '0' && str[i] <= '9')
{
sum += a[str[i] - '0'] * (16/pow(16,i));
}
else
{
sum += a[str[i] - 'A' + 10] * (16/pow(16,i));
}
}

return (char)sum;

}

void StringConvert(char *str)
{
unsigned int len = strlen(str);
if(len & 1)
{
//字符串数目为奇数,编码有问题,自动清空
//你可以根据自己情况处理
*str = '\0';
return ;
}

unsigned int i, nCount = 0;
char a[3] = {0};

for(i = 0; i < len / 2; ++ i)
{
a[0] = str[i*2];//第一位
a[1] = str[i*2 + 1];//第二位
a[2] = '\0';

str[nCount ++] = FromStrToChar(a);
}
str[nCount] = '\0';
}

void main()
{
char str[] = "7C7C307C724C7C267C7C7C7C7C3A7C417C7C";

StringConvert(str);

printf("%s\n",str);

}


以上代码通过测试,LZ可以根据自己的情况稍作处理。

#13


程序没什么难度,大家都能写出来.
我来挑战一下代码长度吧 求C语言16进制字符串转化成字符串的方法。100分!.
#include <stdio.h>
void h2s(const char *s, char *o) {
  // 计算代码共108个字符,应该还能精简
  for(int i=0,c;c=s[i];++i)(o[i/2]*=(i%2)*16)+=c<'0'?0:c<':'?c-'0':c<'A'?0:c<'G'?c-'7':c<'a'?0:c<'g'?c-'W':0;
}
int main() {
  char o[256] = {0};
  h2s("7C7C307C724C7C267C7C7C7C7C3A7C417C7C",o);
  puts(o);
  return 0;
}

#14


完全不考虑校验,这样也可以...63个字符
void h2s(const char *s, char *o) {
for(int i=0,c;c=s[i];++i)(o[i/2]*=i<<4&16)+=(c/16<4?c:c+9)&15;
}

#15


该回复于2012-08-18 15:48:46被版主删除

#16


引用 4 楼  的回复:
char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;v);
 s[i]=(char)(v&amp;0xFFu);
}
s[i]=0;
printf……


这么久才来回复,实在不应该。您的方法是最为简洁且功能完美实现的,谢谢。不过我“s[i]=(char)(v&amp;0xFFu);”这句不是很理解,能帮我解释一下吗?

#17


引用 13 楼  的回复:
程序没什么难度,大家都能写出来.
我来挑战一下代码长度吧.
C/C++ code
#include <stdio.h>
void h2s(const char *s, char *o) {
  // 计算代码共108个字符,应该还能精简
  for(int i=0,c;c=s[i];++i)(o[i/2]*=(i%2)*16)+=c<'0'?0:c<':'?c-'0':c<'A'?0:c<……

您的代码确实很简洁,但是不知为何,我在linux下去编译会报错的呢?

#18


引用 16 楼  的回复:
引用 4 楼 的回复:

char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;amp;v);
 s[i]=(char)(v&amp;amp;0xFFu……

s[i]=(char)(v&0xFFu);
将int类型的v按位与0x000000FFu这个无符号十六进制数FF,即v除以256的余数,强制类型转换为char类型之后,赋值给元素类型为char类型的数组s的第i个元素。

#19


引用 18 楼  的回复:
引用 16 楼  的回复:
引用 4 楼 的回复:

char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;amp;amp;v);
 s[i]=(c……
赵老师请教你个问题,如果原始数据在文件中是16进制的,比如00 37 31 34 35 39这样的,该怎么处理啊?希望你能帮帮忙

#20


引用 19 楼 qsdychl000000 的回复:
[Quote=引用 18 楼  的回复:]

引用 16 楼  的回复:
引用 4 楼 的回复:

char hex[101];
char s[51];
strcpy(hex,"7C7C307C724C7C267C7C7C7C7C3A7C417C7C");
L=strlen(hex);
for (i=0;i<L/2;i++) {
 sscanf(hex+i*2,"%2X",&amp;amp;amp;v);
 s[i]=(c……
赵老师请教你个问题,如果原始数据在文件中是16进制的,比如00 37 31 34 35 39这样的,该怎么处理啊?希望你能帮帮忙
你可以用先循环判断去掉空格,结果用一个字符串来存储,然后再使用strcpy

#21


你们的代码自己测试了吗?就都贴上来了,全是毛病,就3楼的一次性通过了。这就是砖家!

#22


引用 11 楼 gz_qmc 的回复:
void ShowStr(char *sStr);

void main()
{
    ShowStr("7C7C307C724C7C267C7C7C7C7C3A7C417C7C7C\0");
}

void ShowStr(char *sStr)
{
char tStr[3];            //临时字串
char ch;                 //转变后字符
int  n=0;                //原字串计数
if(sStr==NULL) return;   //空串就不操心了

while(1)
{
tStr[0]=sStr[n];        //取1个字符到临时串
if(tStr[0]==0) break;    //如果该字符为零,表示原字串已经取完
n++;                  
tStr[1]=sStr[n];        //再取1个字符到临时串
n++;
tStr[2]=0;               //临时串的第3个字符坚决为0

sscanf(tStr,"%x",&ch);   //将临时串以16进制方式给转变字符赋值
printf("%c",ch);         //输出ch对应的字符

if(tStr[1]==0) break;     //如果临时串第2字符为零,表示最后一个数据是单的,原字串已经取完
}

printf("\n");      //附加赠送,完成后换一行
}


用了 崩溃 。。。。 求C语言16进制字符串转化成字符串的方法。100分!

#23


引用 14 楼 redleaves 的回复:
完全不考虑校验,这样也可以...63个字符
void h2s(const char *s, char *o) {
for(int i=0,c;c=s[i];++i)(o[i/2]*=i<<4&16)+=(c/16<4?c:c+9)&15;
}


用了 崩溃 。。

#24


引用 13 楼 redleaves 的回复:
程序没什么难度,大家都能写出来.
我来挑战一下代码长度吧 求C语言16进制字符串转化成字符串的方法。100分!.
#include <stdio.h>
void h2s(const char *s, char *o) {
  // 计算代码共108个字符,应该还能精简
  for(int i=0,c;c=s[i];++i)(o[i/2]*=(i%2)*16)+=c<'0'?0:c<':'?c-'0':c<'A'?0:c<'G'?c-'7':c<'a'?0:c<'g'?c-'W':0;
}
int main() {
  char o[256] = {0};
  h2s("7C7C307C724C7C267C7C7C7C7C3A7C417C7C",o);
  puts(o);
  return 0;
}


其中的for(int i = 0, c..)是什么意思??是初始化条件是int i = 0和C为有值的意思吗?