+7(960) 250-82-68 info@mirossa.ru


 mirossa        1С           C         PHP       JAVA  


Статьи
 
 

Base64. Encode

CMD.exedownload base64encode.exe
CMD.exedownload 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

// 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", "r");
	 int numread;
	 
	 if (in == NULL) {
		printf("Cannot open \"in\" file.\n");
		exit (1);
	 }
	 
	 FILE * out = fopen("out.txt", "w");
	 if (out == NULL) {
		printf("Cannot open \"out\" file.\n");
		exit (1);
	 }
	 
	 //while (fscanf(in, "%99s", line) != EOF ){
	 //while (fgets (line, 99, in) != NULL){
		
	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

CMD.exedownload base64decode.exe
CMD.exedownload 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


 #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", "r");
	 if (out == NULL) {
		printf("Cannot open \"out\" file.\n");
		exit (1);
	 }
	 
	 FILE * in = fopen("in.txt", "w");
	 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...