入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

将16进制文本转换为ascii码的C语言代码

创建时间:2013-03-15 投稿人: 浏览次数:9457
我用的将16进制文本转换为ascii码的C语言代码。16进制文本复制到文件test.txt中,运行程序,将得到输入。   例: 运行:./CSTRING test.txt   其中,test.txt文件内容为: 30:31:32   则得到的"Cstring.txt"输入文件中  012   本程序能自动跳过0个或多个分隔符(分隔符可以为任意的符号,如“:”,“%”或空格等,判断的函数实现见SkipDelimiter函数)。 如:输入文件内容为: 30     31            32 或 303132 得到的都是 012  
#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
", (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!
");
		return -1;
	}
	return ucTmp;
}

uint8 GetOneChar(uint8 *pucBuf)
{
	uint8 ucChar = 0x00;
	if(NULL == pucBuf)
	{
		printf("para is NULL!
");
		return -1;
	}

	ucChar = ConverseOneChar(pucBuf[0]);
	printf("first ucChar= 0x%x
", (char)ucChar);
	ucChar <<= 4;
	ucChar |= ConverseOneChar(pucBuf[1]);
	printf("second ucChar= %c[0x%x]
", (char)ucChar, ucChar);

	return ucChar;
}

int SkipDelimiter(uint8 *pcBuf)
{
    int n = 0;
    char *pcBufTmp = (char *)pcBuf;
    
    for(n = 0; (pcBufTmp[n] != "") && (pcBufTmp[n] != "
") && (pcBufTmp[n] != "
"); 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!
");
		return -1;
	}
	pucSrcTmp = pucSrcBuf;
	pucDstTmp = pucDstBuf;


	while(iFileLenRemain != 0)
	{
		ucTmp = GetOneChar(pucSrcTmp);
		printf("ucTmp = %c
", (char)ucTmp);
		pucDstTmp[n++] = ucTmp;

		pucSrcTmp += 2;
        iDelimiterNum = SkipDelimiter(pucSrcTmp);
        printf("iDelimiterNum=%d
", iDelimiterNum);
		pucSrcTmp += iDelimiterNum;
		iFileLenRemain -= 2 + iDelimiterNum;
	}

	return n;
}

int main(int argc, char **argv)
{
	int iRet = 0;
	char *pcFileForChange = NULL;
	int iSrcFd = 0;
	int iDstFd = 0;
	int iSrcFileLen = 0;
	int n = 0;
	unsigned char *pucSrcBuf = NULL;
	unsigned char *pucDstBuf = NULL;

	if(argc != 2)
	{
		printf("you need input the filename to change!
");
		return -1;
	}

	pcFileForChange = argv[1];
	printf("filename:%s
", pcFileForChange);
	iSrcFd = open(pcFileForChange, O_RDONLY);
	if (iSrcFd < 0)
	{
		printf("open file:[%s] faild!
", pcFileForChange);
		return -1;
	}
	iDstFd = open("Cstring.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
	if (iDstFd < 0)
	{
		printf("open change filename file faild!
");
		return -1;
	}

	iSrcFileLen = lseek(iSrcFd, 0, SEEK_END);
	printf("FileLen:%d
", iSrcFileLen);
	lseek(iSrcFd, 0, SEEK_SET);
	pucSrcBuf = malloc(iSrcFileLen + 1024);
	pucDstBuf = malloc(iSrcFileLen);
	memset(pucSrcBuf, 0, iSrcFileLen);
	memset(pucDstBuf, 0, iSrcFileLen);

	iRet = read(iSrcFd, pucSrcBuf, iSrcFileLen);
	if(iRet != iSrcFileLen)
	{
		printf("read err, read len = %d
", iRet);
		return -1;
	}
	printf("read:%s
", pucSrcBuf);

	n = ParseHexString(pucSrcBuf, iSrcFileLen, pucDstBuf);
	printf("write:
%s
", pucDstBuf);

	iRet = write(iDstFd, pucDstBuf, n);
	if(iRet != n)
	{
		printf("write err, write len = %d
", iRet);
		return -1;
	}

	close(iSrcFd);
	close(iDstFd);


	return 0;
}

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。