将16进制文本转换为ascii码的C语言代码
我用的将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。
