是首先分析一下:我们十六进制的数4616d89f92e6dc333d39a375080045c000c009e800004001e83fc0a80301c0a8030403004d6e00000000450000a4f927它在text文本是以字符串的形式存放的,每个字符占一个字节的大小,46占2个字节,这些会导致一个问题,我们用数组存的时候,buf[1]={0x46},一个字节就可以存放了,现在读进来需要2个字节,所以我们需要把它进行一个转换。实现思路是利用ascii码,把字符转为我们真正的数值,然后2个数值合并为一个16进制数值,这样就可以存放了在一个字节的数组里面了
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
/*
// C prototype : void StrToHex(unsigned char *pbDest, unsigned char *pbSrc, int nLen)
// parameter(s): [OUT] pbDest - 输出缓冲区
// [IN] pbSrc - 字符串
// [IN] nLen - 16进制数的字节数(字符串的长度/2)
// return value:
// remarks : 将字符串转化为16进制数
*/
void StrToHex(unsigned char *pbDest, unsigned char *pbSrc, int nLen)
{
char h1,h2;
unsigned char s1, s2;
for(int i=0; i<nLen; i++)
{
h1 = pbSrc[2*i]; //分别把字符串放入h1,h2
h2 = pbSrc[2*i+1];
s1 = toupper(h1) - 48; //touper函数是把小写字母转为大写字母,然后减48得到我们的10进制数字
s2 = toupper(h2) - 48;
if (s1 >9)
s1 = s1 - 7; //这里是16进制转为10进制,9到16之间是相差7的值,所以减7
if (s2 >9)
s2 = s2 - 7;
pbDest[i] = s1*16 + s2;//合并为一个16进制,s1是16进制的十位,所以*16,个位变为十位
}
}
int main()
{
int fd = -1;
int ret = -1;
unsigned char buf[50]={0}, out[50]={0};
fd = open("a.text", O_RDONLY);
if (-1 == fd)
{
printf("file open fail");
}
ret = read(fd, buf, 50);
if (-1 == ret)
{
printf("read file fail");
}
close(fd);
StrToHex(out, buf, 50);
int i;
for(i=0; i<sizeof(out); i++)
{
printf("out[%2d] : %2x ", i, out[i]);
if ((i + 1) % 8 == 0)
{
printf("\r\n");
}
}
printf("\n");
return 0;
}
参考:
(4条消息) 将字符串转化为16进制数_linbounconstraint的专栏-CSDN博客_字符串怎么转换为16进制数据https://blog.csdn.net/linbounconstraint/article/details/102969943
|