mirror of
https://github.com/dzo/mrz99.git
synced 2025-04-12 06:50:01 +03:00
97 lines
2.0 KiB
C
97 lines
2.0 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
typedef struct header_st {
|
|
int magic; // 0xa55a5aa5
|
|
int len; // len of ver file
|
|
int version;
|
|
int volume; //1
|
|
int zero1;
|
|
int a2c; //2c
|
|
int zeros[5];
|
|
int nfiles; //1
|
|
int dirdepth; //1
|
|
char dirname[64];
|
|
int filestoprocess; //1
|
|
char filename[56];
|
|
int file_length;
|
|
int file_crc;
|
|
int magic1; // 0xa55a5aa5
|
|
int ver_crc; // up to and including magic1
|
|
} header_type;
|
|
|
|
void wscpy(char *d, char *s) {
|
|
while (*s) {
|
|
*d++=*s++;
|
|
d++;
|
|
}
|
|
}
|
|
int crc16a(unsigned char * data_p, int len) {
|
|
unsigned char x;
|
|
unsigned short crc = 0xFFFF;
|
|
|
|
while (len--){
|
|
x = crc >> 8 ^ *data_p++;
|
|
x ^= x>>4;
|
|
crc = (crc << 8) ^ ((unsigned short)(x << 12)) ^ ((unsigned short)(x <<5)) ^ ((unsigned short)x);
|
|
}
|
|
return crc;
|
|
}
|
|
|
|
|
|
unsigned short crc16(const unsigned char *data, int len) {
|
|
unsigned short crc = 0xFFFF;
|
|
int i;
|
|
if (len) do {
|
|
crc ^= *data++;
|
|
for (i=0; i<8; i++) {
|
|
if (crc & 1) crc = (crc >> 1) ^ 0x8408;
|
|
else crc >>= 1;
|
|
}
|
|
} while (--len);
|
|
return(~crc);
|
|
}
|
|
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
header_type h;
|
|
FILE *fin,*fout;
|
|
|
|
memset(&h, 0, sizeof(h));
|
|
|
|
char *dir="OPN090";
|
|
char *datfile="NA090OPN.DAT";
|
|
|
|
if(argc>=2)
|
|
datfile=argv[1];
|
|
|
|
if(argc>=3)
|
|
dir=argv[2];
|
|
|
|
h.magic=0xa55a5aa5;
|
|
h.len=sizeof(h);
|
|
h.version=0x04000000;
|
|
h.volume=1;
|
|
h.a2c=0x2c;
|
|
h.nfiles=1;
|
|
h.dirdepth=1;
|
|
wscpy(h.dirname,dir);
|
|
h.filestoprocess=1;
|
|
wscpy(h.filename,datfile);
|
|
fin=fopen(datfile,"rb");
|
|
fseek(fin, 0L, SEEK_END);
|
|
h.file_length = ftell(fin);
|
|
unsigned char *p=malloc(h.file_length);
|
|
rewind(fin);
|
|
fread(p,1,h.file_length,fin);
|
|
h.file_crc=crc16(p,h.file_length);
|
|
h.magic1=0xa55a5aa5;
|
|
h.ver_crc=crc16((unsigned char *)&h, h.len-4);
|
|
|
|
fout=fopen("NA090OPN.VER","wb");
|
|
fwrite(&h,1,h.len,fout);
|
|
fclose(fout);
|
|
}
|