16进制文件转化对比

  做通讯项目的时候,经常要进行数据收发校验。发送端的数据通过复杂的通讯系统(例如OFDM系统),依次进行交织、编码(LDPC)、映射、IFFT、串并转换……等等,达到接收端,我们只有通过反复的对比才能验证流程的正确性。因为数据的收发都是比特流,所以经常使用16或者二进制文件进行比较。

  很多调试工具都支持数据导出,由于某些原因他们支持的导出格式各不相同。例如:code composer studio支持比较全面,但是NIOS II  IDE数据格式只支持16进制导出,quarutus ii等支持也各不相同。例如我们有下面两个文件需要对比:

  1,源文件

  

0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A0102030405060708090A

  这个文件是一个16进制文件,其实质是0x01 0x02 0x03 ......这样的十六进制数据。

 2,目标文件

  

01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A 01 02 03 04 05 06 07 08 09 0A

  目标文件可能是包含空格,包含0x前缀,例如0x01020304 0x05060708 ....这样的数据。那么怎么对他们进行比较能。下面有个C脚本文件可以实现,功能包含16进制比较和二进制比较。

  

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

long filesize(FILE *stream)
{
   long curpos, length;

   curpos = ftell(stream);
   fseek(stream, 0L, SEEK_END);
   length = ftell(stream);
   fseek(stream, curpos, SEEK_SET);
   return length;
}

int main(int argc, char **argv){
    FILE  *fp_input;
    FILE  *fp_output;
    unsigned long flength = 0L;
    char *str_file = NULL;
    unsigned long i = 0L;
    unsigned long out_size = 0L;
    char  byte_data = 0;
    char  binary_mode = 0;
    char  byte_temp = 0;
    char  hex_byte = 0x00;
    int j = 0;

    /* check usage*/
    if (argc < 3) {
        fprintf(stderr, "hex_export version-1.0 2014-06-27 [email protected]\nto use this tool:\nhex   :%s [input hex filename] [output hex file name]\n", argv[0]);
        fprintf(stderr, "binary:%s [input hex filename] [output hex file name] -b \n", argv[0]);
        exit(-1);
    }
    if(argc == 4){
        binary_mode = 1;
        printf("convert hex into binary\n");
    }

    /*open the specified file*/

    if((fp_input = fopen(argv[1],"r")) == NULL){
        printf("Can‘t open intput file: %s \n",argv[1]);
    }
    if((fp_output = fopen(argv[2],"w")) == NULL){
        printf("Can‘t open output file: %s \n",argv[2]);
    }

    /*get file size*/
    flength = filesize(fp_input);
    if((str_file = (char *)malloc(flength)) == NULL){
        fprintf(stderr,"Can‘t allocate memory for file input!\n");
        exit(-1);
    }

    /*read file*/
    if(fread(str_file, 1, flength, fp_input) == 0){
        fprintf(stderr,"Can‘t read file!\n");
        exit(-1);
    }

    /* do extract hex */

    for(i=0; i<flength; i++){
        if(*(str_file+i) == ‘0‘ && (toupper(*(str_file+i+1)) == ‘X‘)){
            /* just omit*/
        }else if(isxdigit(*(str_file+i))){
            byte_data = toupper(*(str_file+i));
            if(byte_data >= ‘0‘ && byte_data <= ‘9‘){
                hex_byte = byte_data - 0x30;
            }else{
                hex_byte = byte_data - ‘A‘ + 10;
            }
            //byte_data = *(str_file+i);
            if(binary_mode){
                for(j=0; j<4; j++){
                    byte_temp = (hex_byte&(0x1<<(3-j)))>>(3-j);
                    byte_temp += ‘0‘;
                    fprintf(fp_output,"%c\n",byte_temp);
                }
                out_size++;
            }else{
                fprintf(fp_output,"%c\n",byte_data);
                out_size++;
            }
        }
    }

    free(str_file);
    fclose(fp_input);
    fclose(fp_output);

    /*message*/
    printf("Input  file is : %s size = %ld\n", argv[1],flength);
    printf("Output file is : %s size = %ld\n",argv[2],out_size);

    return 0;
}

  3,使用方式

  如果以16进制比较,例如把上面的程序编译为:hex_cmp

  hex_cmp   src_input.dat  src_output.dat :默认进行16进制比较,将文件转换为4bit单位的列模式,而后用 beyond compare等工具比较十分方便。

  如果要比较二进制文件,使用方法:

  hex_cmp  src_input.dat src_output.dat -b:转换为二进制比特流列文件,而后用 beyond compare等工具比较十分方便。

16进制文件转化对比,布布扣,bubuko.com

时间: 2024-12-19 14:41:40

16进制文件转化对比的相关文章

读取16进制文件和校验图片格式的问题。 文件名后缀

概要: 前段时间,要做这样一个校验:当不符合要求的文件,通过修改文件后缀名后,仍然不允许上传. 我想这是大家经常会遇到的一个校验问题.我才用的办法是:用16进制读取文件头部(不妨成为head),比较head和常见文件头部16进制编码,进行判断. 我个人认为,这个校验方法有弊端,例如当两中不同的文件的文件头编码一样时,一种符合上传要求,一种不符合上传要求,起不到校验功能,例如office 2007和zip. 但是这个方法还是很实用的,毕竟文件头一样的不同文件总是不多的,而且在网站上传是碰到的就更少

c# 16进制显示转化

非原创. 接收16进制数据,在TextBox委托显示: private void readPortandShow() { char[] HexChar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; byte receivebyte = (byte)serialPort1.ReadByte(); char hexH = HexChar[receivebyte / 16];

c#与js中10进制16进制的转化,记录防忘

js: var param="11"; param=parseInt(param,16);  //17 param=parseInt(param,10);  //11 //后面的参数表示param的进制 var param=11; param=toString(param,10); //"11" param =toString(param,16); //"B" //后面的参数表示要转化成的进制 c#: string param="11&

关于 NSData 的数据类型(2进制,16进制之间)及深入剖析

1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataencoding:NSUTF8StringEncoding]; NSString->NSData NSString *aString = @"1234abcd"; NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncodin

16进制可逆加密算法

16进制可逆操作类: public static class Hex16 { /// <summary> /// 作用:将字符串内容转化为16进制数据编码,其逆过程是Decode /// 参数说明: /// strEncode 需要转化的原始字符串 /// 转换的过程是直接把字符转换成Unicode字符,比如数字"3"-->0033,汉字"我"-->U+6211 /// 函数decode的过程是encode的逆过程. /// </sum

【转】iOS中16进制转10进制

原文网址:http://www.voidcn.com/blog/u012198553/article/p-4976772.html /// 将十六进制的字符串转化为NSData - (NSData )transStrHexToData:(NSString )strHex { /// bytes索引 NSUInteger j = 0; NSInteger len = strHex.length; if (len % 2 == 1) { /// 若不能被2整除则说明16进制的字符串不满足图片图.特此

16进制与字符串互转函数【转】

// C prototype : void StrToHex(BYTE *pbDest, BYTE *pbSrc, int nLen) // parameter(s): [OUT] pbDest - 输出缓冲区// [IN] pbSrc - 字符串// [IN] nLen - 16进制数的字节数(字符串的长度/2)// return value: // remarks : 将字符串转化为16进制数*/void StrToHex(BYTE *pbDest, BYTE *pbSrc, int nLe

iOS开发时间戳与时间NSDate,时区的转换,汉字与UTF8,16进制的转换

http://blog.sina.com.cn/s/blog_68661bd80101njdo.html 标签: ios时间戳 ios开发时间戳 ios16进制转中文 ios开发utf8转中文 ios汉字转utf8和16进   //获取当前系统的时间戳+(long)getTimeSp{    long time;    NSDate *fromdate=[NSDate date];    time=(long)[fromdate timeIntervalSince1970];    return

16进制字符串转换为NSData,然后转换为NSString---用于安全支付环境

16进制字符串转换为NSData,然后转换为NSString---用于安全支付环境 +(NSData *)hexToByteToNSData:(NSString *)str { int j=0; Byte bytes[[str length]/2]; for(int i=0;i<[str length];i++) { int int_ch; ///两位16进制数转化后的10进制数 unichar hex_char1 = [str characterAtIndex:i]; ////两位16进制数中