Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Programming in C Base 64 Encode/Decode Base-64.c #include <stdio.h> #include <st

ID: 3846471 • Letter: P

Question

Programming in C Base 64 Encode/Decode

Base-64.c

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

char map(unsigned value)
{
   if (value < 26) return 'A' + value;
   if (value < 52) return 'a' + value - 26;
   if (value < 62) return '0' + value - 52;
   if (62 == value) return '+';
   if (63 == value) return '/';
      
   return '?';
}

unsigned unmap(char c)
{
   if ('/' == c)   return 63;
   if ('+' == c)   return 62;
   if (isdigit(c)) return 52 + (c - '0');
   if (islower(c)) return 26 + (c - 'a');
   if (isupper(c)) return 0 + (c - 'A');
      
  
   return 0xFFFFFFFF;
}

int main(void)
{
   char *message = "Hello World!";
  
   unsigned data = 062434752; // 0xCA35EA;
   char chars[4];
  
   printf("DATA: %o ", data);
  
   for (int i = 0; i < 4; i++)
   {
       unsigned value = (data >> (18 - 6 * i)) & 077;
      
       chars[i] = map(value);
   }
  
   printf("MSG : ");
   for (int i = 0; i < 4; i++)
   {
      
       printf("%c", chars[i]);
   }
   printf(" ");
  
   data = 0;
   for (int i = 0; i < 4; i++)
   {
       unsigned value = unmap(chars[i]);
      
       data <<= 6;
       data += value;
   }
  
   printf("DATA: %o ", data);

   return EXIT_SUCCESS;
}

PR01
Write a program that accepts two command line arguments. The first is the name of a file that
is to be used as the input file and the second is the name of the output file.
The program is to base-64 encode the first file, which is to be treated as a binary file, into the
second. The first line of the output file, which is a text file, should contain the name of the first
file (so that the reconstructed data can be placed in a file of the correct name later).
Your program should print to the console the total number of bytes contained in the input file.

PR02
Write a program that accepts one command line argument, which is the name of a base-64
encoded text file.
The program is to base-64 decode the file, which is to be treated as a text file, outputting the
result into a second file (to be treated as a binary file) using as the name the string of text read
from the first line of the input file.
Your program should print to the console the total number of bytes written to the output file.

Explanation / Answer

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

char map(unsigned value)
{
   if (value < 26) return 'A' + value;
   if (value < 52) return 'a' + value - 26;
   if (value < 62) return '0' + value - 52;
   if (62 == value) return '+';
   if (63 == value) return '/';
      
   return '?';
}

unsigned unmap(char c)
{
   if ('/' == c)   return 63;
   if ('+' == c)   return 62;
   if (isdigit(c)) return 52 + (c - '0');
   if (islower(c)) return 26 + (c - 'a');
   if (isupper(c)) return 0 + (c - 'A');
      
  
   return 0xFFFFFFFF;
}

int main(void)
{
   char *message = "Hello World!";
  
   unsigned data = 062434752; // 0xCA35EA;
   char chars[4];
  
   printf("DATA: %o ", data);
  
   for (int i = 0; i < 4; i++)
   {
       unsigned value = (data >> (18 - 6 * i)) & 077;
      
       chars[i] = map(value);
   }
  
   printf("MSG : ");
   for (int i = 0; i < 4; i++)
   {
      
       printf("%c", chars[i]);
   }
   printf(" ");
  
   data = 0;
   for (int i = 0; i < 4; i++)
   {
       unsigned value = unmap(chars[i]);
      
       data <<= 6;
       data += value;
   }
  
   printf("DATA: %o ", data);

   return EXIT_SUCCESS;
}