Advertisement
PRJS

CODE EXAMPLE

Feb 26th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. //
  2. //  main.cpp
  3. //  Prog01
  4. //
  5. //  Created by Бернат Данила on 12/24/19.
  6. //  Copyright © 2019 Данила Бернат. All rights reserved.
  7. //
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <iostream>
  11. #include <stdlib.h>
  12. #include <bitset>
  13. using namespace std;
  14.  
  15.  
  16.  
  17. void conv16to2(string *trans)
  18. {
  19.     string c = *trans;
  20.     int dec = 0;
  21.     int len = c.length();
  22.     int n = 1;
  23.  
  24.     for (int i = len - 1; i >= 0 ; i--){
  25.         if ('0' <= c[i] && c[i] <= '9')
  26.             dec += int(c[i] - '0') * n;
  27.         else
  28.             dec += (10 + int(c[i] - 'A')) * n;
  29.         n *= 16;
  30.     }//перевод в 10
  31.  
  32.     n = 0;
  33.     int ost;
  34.     char transIn2[10] = "";
  35.  
  36.     do{
  37.         ost = dec % 2;
  38.         if (ost < 10)
  39.             transIn2[n] = char('0' + ost);
  40.         else
  41.             transIn2[n] = char('A' + ost - 10);//перевод в 2
  42.         n++;
  43.         dec /= 2;
  44.     }while(dec);
  45.  
  46.     //len = strlen(transIn2);
  47.     int i=0;
  48.     while (transIn2[i] != '\0')
  49.         i++;
  50.     len=i;
  51.  
  52.     c="";
  53.    
  54.     for (int i = len - 1; i >= 0; i--){
  55.         c=c+transIn2[i];
  56.     }
  57.     *trans=c;
  58. }
  59.  
  60. int conv2to10(string trans)
  61. {
  62.    return bitset<32>(trans).to_ulong();
  63.    
  64. }
  65.  
  66.  
  67.  
  68. int main() {
  69.    
  70.     const string base64_chars =
  71.     "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  72.     "abcdefghijklmnopqrstuvwxyz"
  73.     "0123456789+/";
  74.    
  75.    
  76.     string inputStr, outputStr="";
  77.    
  78.     int number; cin>>number;//кол-во символов
  79.     string usefull; getline(cin, usefull);//для корректного воода
  80.    
  81.    getline(cin, inputStr);//
  82.     inputStr=inputStr+" ";//
  83.    
  84.     const unsigned long strLength=inputStr.length();//длина строки
  85.    
  86.    
  87.     string binStr="";//строка для хранения временного бинарного кода
  88.    
  89.     int strArrNum = number*8/6;
  90.     while (strArrNum % 4 != 0){
  91.         strArrNum++;
  92.     }
  93.     string strArr[strArrNum]; //массив кода для base64 символов
  94.     int strArrNumCopy=strArrNum;
  95.     strArrNum=0;
  96.    
  97.    
  98.     //цикл с конвертацией в бинарный код
  99.     int leftBorder=0, rightBorder;//края символа
  100.     string trans="";//строка с 16ричным числом
  101.    
  102.     for (int i=0; i<strLength; i++)
  103.     {
  104.         if (inputStr[i]==' '){
  105.             rightBorder = i - 1;
  106.            
  107.             for (int j=leftBorder; j<=rightBorder; j++){//выделение числа
  108.                 trans=trans+inputStr[j];
  109.             }
  110.             conv16to2(&trans);//получил значиние переведенное в двоичную систему
  111.            
  112.             while (true)//проверка с подстановкой 0
  113.             if (trans.size()<8){trans="0"+trans;}else{break;}
  114.            
  115.             binStr=binStr+trans;
  116.            
  117.             while (binStr.size()>=6)//цикл по переводу бинарного кода в массив строк
  118.             {
  119.                 strArr[strArrNum].insert(0, binStr, 0, 6);
  120.                 strArrNum++;
  121.                 binStr.erase(0, 6);
  122.             }
  123.            
  124.            
  125.             trans="";
  126.             leftBorder=rightBorder+2;
  127.         }
  128.     }
  129.     if (strArrNum<strArrNumCopy && strArr[strArrNum].size()<6){
  130.     strArr[strArrNum]=binStr;
  131.     }
  132.    
  133.     while (strArr[strArrNum].length()<6)
  134.     strArr[strArrNum]=strArr[strArrNum]+"0";
  135.  
  136.      
  137.     //на этом этапе массив строк хранит в себе код который нужно перевести в base64 символы;
  138.    
  139.    
  140.    
  141.     int base64Num;
  142.     strArrNum=strArrNumCopy;
  143.     for (int i=0; i<strArrNum; i++)
  144.     {
  145.         if(strArr[i]==""){outputStr=outputStr+"=";}
  146.         else{
  147.         base64Num=conv2to10(strArr[i]);
  148.         outputStr=outputStr+base64_chars[base64Num];
  149.         }
  150.        
  151.     }
  152.       cout<<outputStr;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement