I've written a simple program to parse a text file and create a binary file from it.
The program scans every character of the text file looking for "0x" and then writes the next two characters in the new file as their binary value (0x00 - 0xff)
However I'm finding that an extra binary character (value 0x0d) is being written to location 0x0a in the output binary file.
Have I made a stupid mistake in my code?
I'm using GCC - could it be the compiler?
Could it be a non printable character in the input file?
Thanks,
Andy
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *src;
FILE *dst;
char sstr[100];
int ch;
int ReadString(void)
{
if(fgets(sstr,100,src) != NULL)
{
printf("\n%s",sstr);
ch = 0;
return 1;
}
else
{
return 0;
}
}
int main()
{
char dstr[100];
char c;
unsigned char h;
int state = 0;
printf("Enter File Path and Name to Open\n");
scanf("%s",sstr);
src = fopen(sstr,"r");
if(src == NULL)
{
printf("Error Opening File %s\n",sstr);
return 0;
}
else
{
printf("Successfully Opened File %s\n",sstr);
}
ch = (strchr(sstr,'.') - sstr) + 1;
strncpy(dstr,sstr,ch);
dstr[ch++] = 'b';
dstr[ch++] = 'i';
dstr[ch++] = 'n';
dstr[ch] = 0;
dst = fopen(dstr,"w");
if(dst == NULL)
{
printf("Error Creating File %s\n",dstr);
fclose(src);
return 0;
}
else
{
printf("Successfully Opened File %s\n",dstr);
}
if(!ReadString())
{
fclose(src);
fclose(dst);
return 0;
}
while(sstr[ch]!=0)
{
switch(state)
{
case 0: c = sstr[ch++];
if(c == '/') {
state = 20;
}
if(c == '0') {
state = 10;
}
break;
case 10: c = sstr[ch++];
if(c == 'x') {
h = 0;
state = 11;
}
break;
case 11:
c = sstr[ch++];
if((c > 0x2F) && (c < 0x3A)) {
h = c - 0x30;
}
if((c > 0x40) && (c < 0x47)) {
h = c - 0x37;
}
if((c > 0x60) && (c < 0x67)) {
h = c - 0x57;
}
h = h << 4;
state++;
break;
case 12:
c = sstr[ch++];
if((c > 0x2F) && (c < 0x3A)) {
c = c - 0x30;
}
if((c > 0x40) && (c < 0x47)) {
c = c - 0x37;
}
if((c > 0x60) && (c < 0x67)) {
c = c - 0x57;
}
h = h + c;
fputc(h,dst);
state = 0;
if(h<0x10)
printf("0");
printf("%X ",h);
break;
case 20: c = sstr[ch++];
if(c == '/') {
if(!ReadString()) {
fclose(src);
fclose(dst);
return 0;
}
state = 0;
}
break;
}
if((ch>=100) || (sstr[ch] == 0))
{
if(!ReadString())
{
fclose(src);
fclose(dst);
return 0;
}
}
}
fclose(src);
fclose(dst);
return 0;
}
Input file text:
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,
0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,
0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF,
0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,
0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,
0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,
|