核心思想:将16进制的数字转成16进制的表示,那么printf16进制的值,打印的而必然是16进制对应的ascii。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <libgen.h>
#include <fcntl.h>
#include <stdlib.h>
typedef unsigned char uint8;
uint8 ConverseOneChar(uint8 ucChar)
{
uint8 ucTmp = 0x00;
// printf("one ucChar= 0x%x\n", (char)ucChar);
switch(ucChar)
{
case '0':
ucTmp = 0x00;
break;
case '1':
ucTmp = 0x01;
break;
case '2':
ucTmp = 0x02;
break;
case '3':
ucTmp = 0x03;
break;
case '4':
ucTmp = 0x04;
break;
case '5':
ucTmp = 0x05;
break;
case '6':
ucTmp = 0x06;
break;
case '7':
ucTmp = 0x07;
break;
case '8':
ucTmp = 0x08;
break;
case '9':
ucTmp = 0x09;
break;
case 'a':
case 'A':
ucTmp = 0x0a;
break;
case 'b':
case 'B':
ucTmp = 0x0b;
break;
case 'c':
case 'C':
ucTmp = 0x0c;
break;
case 'd':
case 'D':
ucTmp = 0x0d;
break;
case 'e':
case 'E':
ucTmp = 0x0e;
break;
case 'f':
case 'F':
ucTmp = 0x0f;
break;
default:
printf("err char!\n");
return -1;
}
return ucTmp;
}
uint8 GetOneChar(uint8 *pucBuf)
{
uint8 ucChar = 0x00;
if(NULL == pucBuf)
{
printf("para is NULL!\n");
return -1;
}
ucChar = ConverseOneChar(pucBuf[0]);
// printf("first ucChar= 0x%x\n", (char)ucChar);
ucChar <<= 4;
ucChar |= ConverseOneChar(pucBuf[1]);
// printf("second ucChar= %c[0x%x]\n", (char)ucChar, ucChar);
return ucChar;
}
int SkipDelimiter(uint8 *pcBuf)
{
int n = 0;
char *pcBufTmp = (char *)pcBuf;
for(n = 0; (pcBufTmp[n] != '\0') && (pcBufTmp[n] != '\n') && (pcBufTmp[n] != '\r'); n++)
{
if ((pcBufTmp[n] == '0')
|| (pcBufTmp[n] == '1')
|| (pcBufTmp[n] == '2')
|| (pcBufTmp[n] == '3')
|| (pcBufTmp[n] == '4')
|| (pcBufTmp[n] == '5')
|| (pcBufTmp[n] == '6')
|| (pcBufTmp[n] == '7')
|| (pcBufTmp[n] == '8')
|| (pcBufTmp[n] == '9')
|| (pcBufTmp[n] == 'A') || (pcBufTmp[n] == 'a')
|| (pcBufTmp[n] == 'B') || (pcBufTmp[n] == 'b')
|| (pcBufTmp[n] == 'C') || (pcBufTmp[n] == 'c')
|| (pcBufTmp[n] == 'D') || (pcBufTmp[n] == 'd')
|| (pcBufTmp[n] == 'E') || (pcBufTmp[n] == 'e')
|| (pcBufTmp[n] == 'F') || (pcBufTmp[n] == 'f'))
{
break;
}
}
return n;
}
int ParseHexString(unsigned char *pucSrcBuf, int iSrcFileLen, unsigned char *pucDstBuf)
{
uint8 *pucSrcTmp = NULL;
uint8 *pucDstTmp = NULL;
uint8 ucTmp = 0;
int iFileLenRemain = iSrcFileLen;
int iDelimiterNum = 0;
int n = 0;
if((NULL == pucSrcBuf)||(NULL == pucSrcBuf))
{
printf("para 1 or 2 is NULL!\n");
return -1;
}
pucSrcTmp = pucSrcBuf;
pucDstTmp = pucDstBuf;
while(iFileLenRemain != 0)
{
ucTmp = GetOneChar(pucSrcTmp);
// printf("ucTmp = %c\n", (char)ucTmp);
pucDstTmp[n++] = ucTmp;
pucSrcTmp += 2;
iDelimiterNum = SkipDelimiter(pucSrcTmp);
// printf("iDelimiterNum=%d\n", iDelimiterNum);
pucSrcTmp += iDelimiterNum;
iFileLenRemain -= 2 + iDelimiterNum;
}
return n;
}
char * numtoascii(char * string){
int iRet = 0;
char *pcFileForChange = NULL;
int iDstFd = 0;
int iSrcFileLen = 0;
int n = 0;
unsigned char *pucSrcBuf = NULL;
unsigned char *pucDstBuf = NULL;
iSrcFileLen=strlen(string);
iDstFd = open("Cstring.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
if (iDstFd < 0)
{
printf("open change filename file faild!\n");
exit(0);
}
// printf("FileLen:%d\n", iSrcFileLen);
pucSrcBuf = malloc(iSrcFileLen + 1024);
pucDstBuf = malloc(iSrcFileLen);
memset(pucSrcBuf, 0, iSrcFileLen);
memset(pucDstBuf, 0, iSrcFileLen);
pucSrcBuf=string;
// printf("read:%s\n", pucSrcBuf);
n = ParseHexString(pucSrcBuf, iSrcFileLen, pucDstBuf);
// printf("write:\n%s\n", pucDstBuf);
iRet = write(iDstFd, pucDstBuf, n);
if(iRet != n)
{
printf("write err, write len = %d\n", iRet);
exit(0);
}
close(iDstFd);
return pucDstBuf;
}
16进制转ascii接口
最新推荐文章于 2020-06-08 11:07:54 发布