以十六进制存储的文本文档正确读入内存的转化程序

来源:互联网 发布:淘宝上微博小号怎么买 编辑:程序博客网 时间:2024/04/30 01:54

/*约定:文本中十六进制的abcdef以大写方式出现;每个字节以2个字符表示,如0x2应写成0x02*/

#include  "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int i, j = 0;
    char tmp;
    unsigned char buf[128], buf2[128];
    FILE *fp = fopen("1", "r");
    int size = fread(buf, 1, sizeof(buf), fp);

    printf("size = %d/n", size);

    for(i = 0; i < size; i++)
    {
        printf("%x ", buf[i]);
    }
    printf("/n");


    for(i = 0; i < size;)
    {
        //find a value
        if(((buf[i] >=0x30) && (buf[i] <=0x39)) || ((buf[i] >= 0x41) && (buf[i] <= 0x46))) //0...9
        {
            if((buf[i] >=0x30) && (buf[i] <=0x39)) //0..9
            {
                buf2[j] = buf[i] - 0x30;
            }
            else //ABCDEF
            {
                buf2[j] = buf[i] - 0x37;
            }

            if((buf[i+1] >=0x30) && (buf[i+1] <=0x39)) //0..9
            {
                tmp = buf[i+1] - 0x30;
            }
            else if((buf[i] >= 0x41) && (buf[i] <= 0x46)) //abcdef
            {
                tmp = buf[i+1] - 0x37;
            }
            else
            {
                printf("error/n");
                return 1;
            }

            //format a value
            buf2[j] = (buf2[j] << 4) | tmp;
            printf("%x ", buf2[j]);

            j++; //real num++
            i += 2;
        }
        else //find next
        {
            i++;
        }
    }
    printf("/n");

    return 0;

原创粉丝点击