Base64. Encode
download base64encode.exe
download base64encode_32bit.exe
//приложение ищет в текущем каталоге файл in.txt. Читает из него текст, который нужно закодировать.
//Кодирует текст в base64 и записывает в файл out.txt (создает или перезаписывает)
//cd "C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin"
//x86_64-w64-mingw32-gcc.exe base64encode.c -o base64encode.exe
//cd "C:\Program Files (x86)\C-Free 5\mingw\bin"
//gcc.exe base64encode.c -o base64encode_32bit.exe
// https://ru.wikipedia.org/wiki/Base64 ; https://studassistent.ru/c/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int i;
char line[100];
char lineRes[133];
char * p;
FILE * in = fopen("in.txt", "rb");
int numread;
if (in == NULL) {
printf("Cannot open \"in\" file.\n");
exit (1);
}
FILE * out = fopen("out.txt", "wb");
if (out == NULL) {
printf("Cannot open \"out\" file.\n");
exit (1);
}
while ((numread = fread(line, sizeof(char), 99, in)) != 0) {
p = lineRes;
for (i = 0; numread > i; i = i + 3) {
if ( (numread - i) > 2){
*p++ = b64[(line[i] >> 2) & 0x3F]; // & 0x3F
*p++ = b64[((line[i] & 0x3) << 4) | ((int) (line[i + 1] & 0xF0) >> 4)];
*p++ = b64[((line[i + 1] & 0xF) << 2) | ((int) (line[i + 2] & 0xC0) >> 6)]; // & 0xC0
*p++ = b64[line[i + 2] & 0x3F];
}else if ( (numread - i) == 2){
*p++ = b64[(line[i] >> 2) & 0x3F]; // & 0x3F
*p++ = b64[((line[i] & 0x3) << 4) | ((int) (line[i + 1] & 0xF0) >> 4)];
*p++ = b64[(line[i + 1] & 0xF) << 2]; // на 2 тоже сдвигаем(там всегда 00)
*p++ = '=';
}else { // = 1
*p++ = b64[(line[i] >> 2) & 0x3F];
*p++ = b64[ ((line[i] & 0x3) << 4) ];
*p++ = '=';
*p++ = '=';
}
}
// *p++ = '\0';
// printf("%s", lineRes);
fwrite(lineRes, sizeof(char), p - lineRes, out);
}
fclose(out);
return 0;
}
Base64. Decode
download base64decode.exe
download base64decode_32bit.exe
//приложение ищет в текущем каталоге файл out.txt. Читает из него текст, который нужно раскодировать.
//И записывает в файл in.txt (создает или перезаписывает)
//cd "C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin"
//x86_64-w64-mingw32-gcc.exe base64decode.c -o base64decode.exe
//cd "C:\Program Files (x86)\C-Free 5\mingw\bin"
//gcc.exe base64decode.c -o base64decode_32bit.exe
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
char b64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char errS[] = " conversion error!";
int i, err = 0, end = 0;
char line[100];
char lineRes[75];
char * p, * fch;
FILE * out = fopen("out.txt", "rb");
if (out == NULL) {
printf("Cannot open \"out\" file.\n");
exit (1);
}
FILE * in = fopen("in.txt", "wb");
int numread;
if (in == NULL) {
printf("Cannot open \"in\" file.\n");
exit (1);
}
while ((numread = fread(line, sizeof(char), 100, out)) != 0) {
p = lineRes;
for (i = 0; numread > i; i = i + 4) {
fch = strchr(b64, (int)line[i]);
if (fch != NULL){
*p = (char)(fch - b64) << 2;
}else{
err = 1;
break;
}
fch = strchr(b64, (int)line[i + 1]);
if (fch != NULL){
*p = *p | (((char)(fch - b64) & 0x30) >> 4);
*(p+1) = ((char)(fch - b64) << 4);
}else{
err = 1;
break;
}
fch = strchr(b64, (int)line[i + 2]);
if (fch != NULL){
*(p + 1) = *(p + 1) | ((char)(fch - b64) >> 2);
*(p + 2) = (char)(fch - b64) << 6;
}else{
if ((char)line[i + 2] == '='){
p = p + 1;
end = 1;
break;
}else{
err = 1;
break;
}
}
fch = strchr(b64, (int)line[i + 3]);
if (fch != NULL){
*(p + 2) = *(p + 2) | (char)(fch - b64);
}else{
if ((char)line[i + 3] == '='){
p = p + 2;
end = 1;
break;
}else{
err = 1;
break;
}
}
p = p + 3;
}
if (err == 0){
fwrite(lineRes, sizeof(char), p - lineRes, in);
if(end == 1)
break;
}else {
if ( (int)(p - lineRes) > 0 )
fwrite(lineRes, sizeof(char), p - lineRes, in);
fwrite(errS, sizeof(char), 18, in);
break;
}
}
fclose(out);
fclose(in);
return 0;
}
to be continued...