Hello everyone,
Well I just finished my code based on some guidance that I found on internet. Unfortunately the output is not the one that I was expecting. Initially I had some warnings about the pointers that I am using, I thought I fixed them by using (char*) as suggests Ubuntu man page.
Maybe this is the problem but because I am a beginner in programming, I can not find the problem. Any one can help me? I have attached the code and the file that I am trying to read.
Is there any way to go step by step the code through any program and see mistakes?
I tried to upload the file but it gives me a continuous error.
Thanks advance for your time and for your help.
Best Regards,
Thanos
Well I just finished my code based on some guidance that I found on internet. Unfortunately the output is not the one that I was expecting. Initially I had some warnings about the pointers that I am using, I thought I fixed them by using (char*) as suggests Ubuntu man page.
Maybe this is the problem but because I am a beginner in programming, I can not find the problem. Any one can help me? I have attached the code and the file that I am trying to read.
Is there any way to go step by step the code through any program and see mistakes?
I tried to upload the file but it gives me a continuous error.
Thanks advance for your time and for your help.
Best Regards,
Thanos
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <unistd.h>
typedef struct{
unsigned char header_id[3]; /* We indicate that this mp3 file is ID3 format 3 bytes */
uint8_t major_version; /* We set the size and type of unsigned integer of length 8 bits to the Major Version, unsigned int minimum value is 0 */
uint8_t revision_number; /* We set the size and type of unsigned integer of length 8 bits to the Revision Number, unsigned int minimum value is 0 */
unsigned char flags; /* We indicate two flag bytes, we use unsigned characters so they can take values 0 - 255 and not -128 up to 127*/
uint32_t size; /* We the size is indicated by 4 bytes = 32 bits */
}mp3_Header;
typedef struct{
uint32_t extended_size;
unsigned char number_flags;
unsigned char extended_flags;
}mp3_Extended_Header;
typedef struct{
unsigned char frame_id[4];
uint32_t frame_size;
unsigned char frame_flags[2];
}mp3_Frame;
int main (int argc, char *argv[])
{
char a[] = "silence.mp3";
if ( argc != 1 ) /* Input from user argc should be 1 for correct
* execution. The argument count variable
* stores the number of arguments plus one. */
{
/*We print argv[0], if the program that user has chosen for
* execution it is not correct as input if has more inputs*/
printf( "Please choose one file: %s <silence.mp3> \n", argv[0] );
}
else
{
mp3_Header first;
mp3_Extended_Header second;
mp3_Frame third;
unsigned char header_id[4], memory[4], new_flagg[2], characters;
int i,b=1;
unsigned long length_of_data = 0;
FILE *file; /* A file pointer is a variable of type FILE,
* we declare a file pointer.*/
file = fopen("silence.mp3", "rb"); /* Open the file
* silence.mp3 in
* "reading" mode "r". */
if (file == NULL) {
/* If the file could not open for a variety of reasons
* the program should inform us by print the document
* and exit.*/
printf( "I couldn't open: %s for reading.\n", a );
exit(0);
}
else
{
/*Set the pointer at the possition at the beggining of the file,
* if the procedure is correct it will return 0 if not it will return -1. */
if (fseek(file, 0 , SEEK_SET) == -1)
{
fprintf(stderr, "Not able to fseek");
return EXIT_FAILURE;
}
/* The function fread() will read 4 bytes of data, each of them in size
* of 1 byte long and they will be stored in memory (givven name) . */
if ( (size_t) fread( memory , (size_t) 4 , (size_t) 1 , file) !=1)
{
printf("Could not read the file\n");
exit (0);
}
/* I will copy the string from location (memory) to the destination tag_id from first typedef stuct */
strncpy( (char *) first.header_id , (char *) memory , (size_t) 4);
if ( (size_t) fread( &first.major_version , (size_t) 1 , (size_t) 1 , file) != 1)
{
printf("Could not read the major_version\n");
exit (0);
}
if ( (size_t) fread( &first.revision_number , (size_t) 1, (size_t) 1 , file) != 1)
{
printf("Could not read the revision_number\n");
exit (0);
}
/* Read the total size of the header */
if ( (size_t) fread(memory , (size_t) sizeof(first.size) , (size_t) 1 , file) != 1)
{
printf("Could not read memory\n");
exit (0);
}
/* We break down the packet in bytes and allocate the bytes in memory in a sequence.
* After the first sequence is stored for the rest we have to shift them by one possition.
* Because the first bit determines the sign on the character/ intiger and we have set it to possitive.
* We shift the possition every 7 bits because 1 byte has 8 bits - 1 the sign ( + , - ). */
first.size = (memory[3] & 0xFF) |
((memory[2] & 0xFF) << 7 ) |
((memory[1] & 0xFF) << 14 ) |
((memory[0] & 0xFF) << 21 );
/* Store temporarilly the length of the data */
length_of_data = first.size;
/* Print the data that we have collect so far */
fprintf( stdout , "%s version %d . %d\t Size %d\n", first.header_id , first. major_version , first.revision_number , first.size);
/* At this point we want to make sure that the whole header has been executed correctly */
if (( first.flags & (01000000) ) == 01000000 )
{
/* Extended Header 6 Bytes */
if ( (size_t) fread( memory , (size_t) sizeof(second.extended_size) , 1 , file ) != 1);
{
printf("Could not read Memory\n");
exit (0);
}
/* Break down the packet in pieces and extrac the data */
second.extended_size = (memory[3] & 0xFF) |
((memory[2] & 0xFF) << 7 ) |
((memory[1] & 0xFF) << 14 ) |
((memory[0] & 0xFF) << 21 );
if ( (size_t) fread( &second.number_flags , 1 , 1 , file ) !=1);
{
printf("Could not read Number of Flags\n");
exit (0);
}
if ( (size_t) fread( &second.extended_flags , 1 , 1 , file ) !=1);
{
printf("Could not read Extended Flags\n");
exit (0);
}
fprintf(stdout,"Extended header size: %d\n", second.extended_size);
/* From the stored value we substract the Extended Header */
length_of_data = length_of_data - second.extended_size;
/* Reposition the seek pointer after the Extended Header */
fseek ( file , second.extended_size + 10 , SEEK_SET );
}
else
{
/* If process has been executed correclty proceed and place reader after Extended Header (10 bytes) */
fseek ( file , 10 , SEEK_SET );
}
while(b!=0) /* Read until the end of file */
{
if ( (size_t) fread( header_id , (size_t) 4 , 1 , file ) !=1);
{
printf("Could not read Header_id_1 \n");
exit (0);
}
strncpy( (char *) third.frame_id , (char *) header_id , (size_t) 4 );
if ( (size_t) fread( memory , (size_t) sizeof(third.frame_size) , 1 , file ) !=1);
{
printf("Could not read Memory\n");
exit (0);
}
/* Extract data and store them */
third.frame_size = (memory[3] & 0xFF) |
((memory[2] & 0xFF) << 7 ) |
((memory[1] & 0xFF) << 14 ) |
((memory[0] & 0xFF) << 21 );
if ( (size_t) fread( new_flagg , (size_t) 2 , 1 , file ) !=1);
{
printf("Could not read Memory\n");
exit (0);
}
strncpy( (char *) third.frame_flags , (char *) new_flagg , (size_t) 2 );
/* Print inforamtion of Frames */
printf("Third Part Frame id : %s Frame Size : %d Flags : ", third.frame_id , third.frame_size );
/* Compare the strings */
if ( strncmp( (char *) third.frame_id , "TPE1" , (size_t) 4 ) == 0 )
{
for ( i = 1; i <= third.frame_size; i++ )
{
characters = fgetc(file);
printf( "Number of characters: %c" , characters );
}
printf("\n");
}
else if ( strncmp( (char *) third.frame_id , "TALB" , (size_t) 4 ) == 0 )
{
for ( i=1 ; i <= third.frame_size; i++ )
{
characters = fgetc(file);
printf( "Number of characters: %c" , characters );
}
printf("\n");
}
else if ( strncmp ( (char *) third.frame_id , "TYER" , (size_t) 4 ) == 0 )
{
for ( i = 1; i <= third.frame_size; i++ )
{
characters = fgetc(file);
printf( "Number of characters: %c" , characters );
}
printf("\n");
}
else if ( strncmp ( (char *) third.frame_id , "TCON" , (size_t) 4 ) == 0 )
{
for ( i = 1; i <= third.frame_size; i++ )
{
characters = fgetc(file);
printf( "Number of characters: %c" , characters );
}
printf("\n");
}
else if ( strncmp ( (char *) third.frame_id , "TRCK" , (size_t) 4 ) == 0 )
{
for ( i = 1; i <= third.frame_size; i++ )
{
characters = fgetc(file);
printf( "Number of characters: %c" , characters );
}
printf("\n");
}
else if ( strncmp ( (char *) third.frame_id , "TIT2" , (size_t) 4 ) == 0 )
{
for ( i = 1; i <= third.frame_size; i++ )
{
characters = fgetc(file);
printf( "Number of characters: %c" , characters );
}
printf("\n");
}
else
{
printf("\n"); b=0;
}
}
printf("Finished Reading, Clossing silence.mp3 file! Goodbye!\n");
fclose(file);
return 0;
}
}
}